From bf0060ba817a8a155241fb0ccb6f0ecb7a580be0 Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Sun, 8 Mar 2026 18:08:50 +0100 Subject: [PATCH 1/4] feat: Add new DamageType --- EXILED/Exiled.API/Enums/DamageType.cs | 78 ++++++++++- .../Extensions/DamageTypeExtensions.cs | 124 +++++++++++++----- .../DamageHandlers/DamageHandlerBase.cs | 97 +------------- .../DamageHandlers/FirearmDamageHandler.cs | 8 -- .../DamageHandlers/GenericDamageHandler.cs | 4 +- .../DamageHandlers/ScpDamageHandler.cs | 29 ---- 6 files changed, 171 insertions(+), 169 deletions(-) diff --git a/EXILED/Exiled.API/Enums/DamageType.cs b/EXILED/Exiled.API/Enums/DamageType.cs index bb6f2524d5..5235da26b8 100644 --- a/EXILED/Exiled.API/Enums/DamageType.cs +++ b/EXILED/Exiled.API/Enums/DamageType.cs @@ -77,7 +77,7 @@ public enum DamageType /// /// Damage dealt by frag grenades. /// - Explosion, + ExplosionGrenade, /// /// Damage dealt by SCP-018. @@ -135,9 +135,9 @@ public enum DamageType Scp049, /// - /// Damage caused by . + /// Damage caused by with unspecified .. /// - Scp096, + Scp096Other, /// /// Damage caused by . @@ -145,7 +145,7 @@ public enum DamageType Scp173, /// - /// Damage caused by . + /// Damage caused by with . /// Scp939, @@ -288,5 +288,75 @@ public enum DamageType /// Damage caused by . /// Scp1509, + + /// + /// Damage caused by with . + /// + Scp939Claw, + + /// + /// Damage caused by with . + /// + Scp939LungeTarget, + + /// + /// Damage caused by with . + /// + Scp939LungeSecondary, + + /// + /// Damage caused by with . + /// + Scp096GateKill, + + /// + /// Damage caused by with . + /// + Scp096SlapLeft, + + /// + /// Damage caused by with . + /// + Scp096SlapRight, + + /// + /// Damage caused by with . + /// + Scp096Charge, + + /// + /// Damage caused by when it's stealing the skin of a . + /// + Scp3114SkinSteal, + + /// + /// Damage cause by the of ."/> + /// + ExplosionScp018, + + /// + /// Damage cause by the of combining with ."/> + /// + ExplosionCola, + + /// + /// Damage cause by the of ."/> + /// + ExplosionPinkCandy, + + /// + /// Damage cause by the ray of ."/> + /// + ExplosionDisruptor, + + /// + /// Damage cause by the of ."/> + /// + ExplosionJailbird, + + /// + /// Damage cause by the explosion of or any other not valid ExplosionType."/> + /// + ExplosionCustom, } } diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 6fde63477d..1ae5f8f88a 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -13,6 +13,7 @@ namespace Exiled.API.Extensions using Enums; using Features; using InventorySystem.Items.Scp1509; + using PlayerRoles; using PlayerRoles.PlayableScps.Scp1507; using PlayerRoles.PlayableScps.Scp3114; using PlayerStatsSystem; @@ -24,34 +25,37 @@ public static class DamageTypeExtensions { private static readonly Dictionary TranslationConversionInternal = new() { + { DeathTranslations.Recontained, DamageType.Recontainment }, + { DeathTranslations.Warhead, DamageType.Warhead }, + { DeathTranslations.Scp049, DamageType.Scp049 }, + { DeathTranslations.Unknown, DamageType.Unknown }, { DeathTranslations.Asphyxiated, DamageType.Asphyxiation }, { DeathTranslations.Bleeding, DamageType.Bleeding }, - { DeathTranslations.Crushed, DamageType.Crushed }, - { DeathTranslations.Decontamination, DamageType.Decontamination }, - { DeathTranslations.Explosion, DamageType.Explosion }, { DeathTranslations.Falldown, DamageType.Falldown }, + { DeathTranslations.PocketDecay, DamageType.PocketDimension }, + { DeathTranslations.Decontamination, DamageType.Decontamination }, { DeathTranslations.Poisoned, DamageType.Poison }, - { DeathTranslations.Recontained, DamageType.Recontainment }, - { DeathTranslations.Scp049, DamageType.Scp049 }, - { DeathTranslations.Scp096, DamageType.Scp096 }, - { DeathTranslations.Scp173, DamageType.Scp173 }, { DeathTranslations.Scp207, DamageType.Scp207 }, - { DeathTranslations.Scp939Lunge, DamageType.Scp939 }, - { DeathTranslations.Scp939Other, DamageType.Scp939 }, - { DeathTranslations.Scp3114Slap, DamageType.Scp3114 }, + { DeathTranslations.SeveredHands, DamageType.SeveredHands }, + { DeathTranslations.MicroHID, DamageType.MicroHid }, { DeathTranslations.Tesla, DamageType.Tesla }, - { DeathTranslations.Unknown, DamageType.Unknown }, - { DeathTranslations.Warhead, DamageType.Warhead }, + { DeathTranslations.Explosion, DamageType.ExplosionCustom }, + { DeathTranslations.Scp096, DamageType.Scp096Other }, + { DeathTranslations.Scp173, DamageType.Scp173 }, + { DeathTranslations.Scp939Lunge, DamageType.Scp939LungeTarget }, { DeathTranslations.Zombie, DamageType.Scp0492 }, { DeathTranslations.BulletWounds, DamageType.Firearm }, - { DeathTranslations.PocketDecay, DamageType.PocketDimension }, - { DeathTranslations.SeveredHands, DamageType.SeveredHands }, - { DeathTranslations.FriendlyFireDetector, DamageType.FriendlyFireDetector }, + { DeathTranslations.Crushed, DamageType.Crushed }, { DeathTranslations.UsedAs106Bait, DamageType.FemurBreaker }, - { DeathTranslations.MicroHID, DamageType.MicroHid }, + { DeathTranslations.FriendlyFireDetector, DamageType.FriendlyFireDetector }, { DeathTranslations.Hypothermia, DamageType.Hypothermia }, + { DeathTranslations.CardiacArrest, DamageType.CardiacArrest }, + { DeathTranslations.Scp939Other, DamageType.Scp939Claw }, + { DeathTranslations.Scp3114Slap, DamageType.Scp3114 }, { DeathTranslations.MarshmallowMan, DamageType.Marshmallow }, { DeathTranslations.Scp1344, DamageType.SeveredEyes }, + { DeathTranslations.Scp1507Peck, DamageType.Scp1507 }, + { DeathTranslations.Scp127Bullets, DamageType.Scp127 }, { DeathTranslations.Scp1509, DamageType.Scp1509 }, }; @@ -113,11 +117,39 @@ public static class DamageTypeExtensions /// Returns whether the is caused by SCP. public static bool IsScp(this DamageType type, bool checkItems = true) => type switch { - DamageType.Scp or DamageType.Scp049 or DamageType.Scp096 or DamageType.Scp106 or DamageType.Scp173 or DamageType.Scp939 or DamageType.Scp0492 or DamageType.Scp3114 => true, + DamageType.Scp or DamageType.Scp049 or DamageType.Scp096SlapLeft or DamageType.Scp096SlapRight or DamageType.Scp096Charge or DamageType.Scp096GateKill or DamageType.Scp096Other or DamageType.Scp106 or DamageType.Scp173 or DamageType.Scp939 or DamageType.Scp939Claw or DamageType.Scp939LungeTarget or DamageType.Scp939LungeSecondary or DamageType.Scp0492 or DamageType.Scp3114 or DamageType.Scp3114SkinSteal => true, DamageType.Scp018 or DamageType.Scp207 when checkItems => true, _ => false, }; + /// + /// Check if a damage type is caused by >. + /// + /// The damage type to be checked. + /// Returns whether the is caused by SCP. + public static bool IsScp096(this DamageType type) => type is DamageType.Scp096SlapLeft or DamageType.Scp096SlapRight or DamageType.Scp096Charge or DamageType.Scp096GateKill or DamageType.Scp096Other; + + /// + /// Check if a damage type is caused by >. + /// + /// The damage type to be checked. + /// Returns whether the is caused by SCP. + public static bool IsScp939(this DamageType type) => type is DamageType.Scp939 or DamageType.Scp939Claw or DamageType.Scp939LungeTarget or DamageType.Scp939LungeSecondary; + + /// + /// Check if a damage type is caused by >. + /// + /// The damage type to be checked. + /// Returns whether the is caused by SCP. + public static bool IsScp049(this DamageType type) => type is DamageType.Scp049 or DamageType.CardiacArrest; + + /// + /// Check if a damage type is caused by >. + /// + /// The damage type to be checked. + /// Returns whether the is caused by SCP. + public static bool IsScp3114(this DamageType type) => type is DamageType.Scp3114 or DamageType.Scp3114SkinSteal or DamageType.Strangled; + /// /// Check if a damage type is caused by a status effect. /// @@ -125,7 +157,7 @@ public static class DamageTypeExtensions /// Returns whether the is caused by status effect. public static bool IsStatusEffect(this DamageType type) => type switch { - DamageType.Asphyxiation or DamageType.Poison or DamageType.Bleeding or DamageType.Scp207 or DamageType.Hypothermia or DamageType.Strangled => true, + DamageType.Asphyxiation or DamageType.Poison or DamageType.Bleeding or DamageType.Scp207 or DamageType.Hypothermia or DamageType.Strangled or DamageType.SeveredHands or DamageType.SeveredEyes or DamageType.PocketDimension => true, _ => false, }; @@ -138,18 +170,36 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) { switch (damageHandlerBase) { + case Features.DamageHandlers.GenericDamageHandler genericDamageHandler: + return GetDamageType(genericDamageHandler.Base); case CustomReasonDamageHandler: return DamageType.Custom; case WarheadDamageHandler: return DamageType.Warhead; - case ExplosionDamageHandler: - return DamageType.Explosion; + case ExplosionDamageHandler explosionDamageHandler: + return explosionDamageHandler.ExplosionType switch + { + ExplosionType.Grenade => DamageType.ExplosionGrenade, + ExplosionType.SCP018 => DamageType.ExplosionScp018, + ExplosionType.PinkCandy => DamageType.ExplosionPinkCandy, + ExplosionType.Cola => DamageType.ExplosionCola, + ExplosionType.Disruptor => DamageType.ExplosionDisruptor, + ExplosionType.Jailbird => DamageType.ExplosionJailbird, + _ => DamageType.ExplosionCustom, + }; case Scp018DamageHandler: return DamageType.Scp018; case RecontainmentDamageHandler: return DamageType.Recontainment; - case Scp096DamageHandler: - return DamageType.Scp096; + case Scp096DamageHandler scp096DamageHandler: + return scp096DamageHandler._attackType switch + { + Scp096DamageHandler.AttackType.GateKill => DamageType.Scp096GateKill, + Scp096DamageHandler.AttackType.SlapLeft => DamageType.Scp096SlapLeft, + Scp096DamageHandler.AttackType.SlapRight => DamageType.Scp096SlapRight, + Scp096DamageHandler.AttackType.Charge => DamageType.Scp096Charge, + _ => DamageType.Scp096Other, + }; case MicroHidDamageHandler: return DamageType.MicroHid; case DisruptorDamageHandler: @@ -176,22 +226,31 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) return scp3114DamageHandler.Subtype switch { Scp3114DamageHandler.HandlerType.Strangulation => DamageType.Strangled, - Scp3114DamageHandler.HandlerType.SkinSteal => DamageType.Scp3114, + Scp3114DamageHandler.HandlerType.SkinSteal => DamageType.Scp3114SkinSteal, Scp3114DamageHandler.HandlerType.Slap => DamageType.Scp3114, _ => DamageType.Unknown, }; case FirearmDamageHandler firearmDamageHandler: - return ItemConversion.ContainsKey(firearmDamageHandler.WeaponType) ? ItemConversion[firearmDamageHandler.WeaponType] : DamageType.Firearm; + if (ItemConversion.ContainsKey(firearmDamageHandler.WeaponType)) + return ItemConversion[firearmDamageHandler.WeaponType]; + + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(ScpDamageHandler)} with ItemType {firearmDamageHandler.WeaponType}, type will be reported as {DamageType.Firearm}. Report this to EXILED Devs."); + + return DamageType.Firearm; case ScpDamageHandler scpDamageHandler: { - DeathTranslation translation = DeathTranslations.TranslationsById[scpDamageHandler._translationId]; - if (translation.Id == DeathTranslations.PocketDecay.Id) + if (scpDamageHandler._translationId == DeathTranslations.PocketDecay.Id) return DamageType.Scp106; - return TranslationIdConversion.ContainsKey(translation.Id) - ? TranslationIdConversion[translation.Id] - : DamageType.Scp; + if (TranslationIdConversion.ContainsKey(scpDamageHandler._translationId)) + return TranslationIdConversion[scpDamageHandler._translationId]; + + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(ScpDamageHandler)} with ID {scpDamageHandler._translationId}, type will be reported as {DamageType.Scp}. Report this to EXILED Devs."); + + return DamageType.Scp; } case UniversalDamageHandler universal: @@ -201,7 +260,9 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) if (TranslationIdConversion.ContainsKey(translation.Id)) return TranslationIdConversion[translation.Id]; - Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(UniversalDamageHandler)} with ID {translation.Id}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(UniversalDamageHandler)} with ID {translation.Id}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); + return DamageType.Unknown; } @@ -209,6 +270,9 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) { if (Player.TryGet(attackerDamageHandler.Attacker, out Player attacker) && attacker.CurrentItem?.Type == ItemType.MarshmallowItem) return DamageType.Marshmallow; + + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(AttackerDamageHandler)} with Type {attackerDamageHandler.GetType()}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); return DamageType.Unknown; } } diff --git a/EXILED/Exiled.API/Features/DamageHandlers/DamageHandlerBase.cs b/EXILED/Exiled.API/Features/DamageHandlers/DamageHandlerBase.cs index 6a9b8f4562..c1e0620746 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/DamageHandlerBase.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/DamageHandlerBase.cs @@ -94,7 +94,7 @@ public virtual DamageType Type if (field != DamageType.Unknown) return field; - field = GetDamageType(); + field = DamageTypeExtensions.GetDamageType(Base); return field; } @@ -185,101 +185,6 @@ public bool BaseIs(out T param) return true; } - /// - /// Gets the assosiated with . - /// - /// from which should be get. If null, will be used. - /// Assosiated . - protected DamageType GetDamageType(BaseHandler damageHandler = null) - { - damageHandler ??= Base; - - switch (damageHandler) - { - case GenericDamageHandler genericDamageHandler: - return GetDamageType(genericDamageHandler.Base); - case CustomReasonDamageHandler: - return DamageType.Custom; - case WarheadDamageHandler: - return DamageType.Warhead; - case ExplosionDamageHandler: - return DamageType.Explosion; - case Scp018DamageHandler: - return DamageType.Scp018; - case RecontainmentDamageHandler: - return DamageType.Recontainment; - case MicroHidDamageHandler: - return DamageType.MicroHid; - case DisruptorDamageHandler: - return DamageType.ParticleDisruptor; - case Scp939DamageHandler: - return DamageType.Scp939; - case JailbirdDamageHandler: - return DamageType.Jailbird; - case Scp1507DamageHandler: - return DamageType.Scp1507; - case Scp956DamageHandler: - return DamageType.Scp956; - case SnowballDamageHandler: - return DamageType.SnowBall; - case GrayCandyDamageHandler: - return DamageType.GrayCandy; - case Scp1509DamageHandler: - return DamageType.Scp1509; - case Scp3114DamageHandler scp3114DamageHandler: - return scp3114DamageHandler.Subtype switch - { - Scp3114DamageHandler.HandlerType.Strangulation => DamageType.Strangled, - Scp3114DamageHandler.HandlerType.SkinSteal => DamageType.Scp3114, - Scp3114DamageHandler.HandlerType.Slap => DamageType.Scp3114, - _ => DamageType.Unknown, - }; - case Scp049DamageHandler scp049DamageHandler: - return scp049DamageHandler.DamageSubType switch - { - Scp049DamageHandler.AttackType.CardiacArrest => DamageType.CardiacArrest, - Scp049DamageHandler.AttackType.Instakill => DamageType.Scp049, - Scp049DamageHandler.AttackType.Scp0492 => DamageType.Scp0492, - _ => DamageType.Unknown, - }; - case UniversalDamageHandler universal: - DeathTranslation translation = DeathTranslations.TranslationsById[universal.TranslationId]; - - if (DamageTypeExtensions.TranslationIdConversion.ContainsKey(translation.Id)) - return DamageTypeExtensions.TranslationIdConversion[translation.Id]; - - Log.Warn($"{nameof(DamageHandler)}.{nameof(Type)}: No matching {nameof(DamageType)} for {nameof(UniversalDamageHandler)} with ID {translation.Id}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); - break; - case PlayerStatsSystem.FirearmDamageHandler firearmDamageHandler: - return Item.Get(firearmDamageHandler.Firearm).FirearmType switch - { - FirearmType.A7 => DamageType.A7, - FirearmType.Com15 => DamageType.Com15, - FirearmType.Com18 => DamageType.Com18, - FirearmType.Crossvec => DamageType.Crossvec, - FirearmType.Logicer => DamageType.Logicer, - FirearmType.Revolver => DamageType.Revolver, - FirearmType.Scp127 => DamageType.Scp127, - FirearmType.Shotgun => DamageType.Shotgun, - FirearmType.AK => DamageType.AK, - FirearmType.ParticleDisruptor => DamageType.ParticleDisruptor, - FirearmType.E11SR => DamageType.E11Sr, - FirearmType.FSP9 => DamageType.Fsp9, - FirearmType.FRMG0 => DamageType.Frmg0, - _ => DamageType.Firearm - }; - - case PlayerStatsSystem.AttackerDamageHandler attackerDamageHandler: - { - if (Player.TryGet(attackerDamageHandler.Attacker, out Player attacker) && attacker.CurrentItem?.Type == ItemType.MarshmallowItem) - return DamageType.Marshmallow; - return DamageType.Unknown; - } - } - - return DamageType.Unknown; - } - /// /// A wrapper to easily manipulate the behavior of . /// diff --git a/EXILED/Exiled.API/Features/DamageHandlers/FirearmDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/FirearmDamageHandler.cs index adcd074a31..ec8b66b4ba 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/FirearmDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/FirearmDamageHandler.cs @@ -35,14 +35,6 @@ public FirearmDamageHandler(Item item, Player target, BaseHandler baseHandler) Item = item; } - /// - public override DamageType Type => Item switch - { - Firearm _ when DamageTypeExtensions.ItemConversion.ContainsKey(Item.Type) => DamageTypeExtensions.ItemConversion[Item.Type], - MicroHid _ => DamageType.MicroHid, - _ => DamageType.Firearm, - }; - /// /// Gets or sets the used by the damage handler. /// diff --git a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs index d55324798e..29783dfa94 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs @@ -127,7 +127,7 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage microHidOwner.Owner = attacker.ReferenceHub; Base = new MicroHidDamageHandler(damage, microHidOwner); break; - case DamageType.Explosion: + case DamageType.ExplosionGrenade: Base = new ExplosionDamageHandler(attacker.Footprint, UnityEngine.Vector3.zero, damage, 0, ExplosionType.Grenade); break; case DamageType.Firearm: @@ -173,7 +173,7 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage case DamageType.ParticleDisruptor: Base = new DisruptorDamageHandler(new (Item.Create(ItemType.ParticleDisruptor, attacker).Base as InventorySystem.Items.Firearms.Firearm, InventorySystem.Items.Firearms.Modules.DisruptorActionModule.FiringState.FiringSingle), Vector3.up, damage); break; - case DamageType.Scp096: + case DamageType.Scp096Other: Scp096Role curr096 = attacker.ReferenceHub.roleManager.CurrentRole as Scp096Role ?? new Scp096Role(); if (curr096 != null) diff --git a/EXILED/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs index 6d44b06d08..08a7cec8d2 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs @@ -30,34 +30,5 @@ public ScpDamageHandler(Player target, BaseHandler baseHandler) : base(target, baseHandler) { } - - /// - public override DamageType Type - { - get - { - switch (Base) - { - case Scp096DamageHandler: - return DamageType.Scp096; - case Scp049DamageHandler scp049DamageHandler: - return scp049DamageHandler.DamageSubType switch - { - Scp049DamageHandler.AttackType.Scp0492 => DamageType.Scp0492, - _ => DamageType.Scp049, - }; - case BaseScpHandler scp: - { - DeathTranslation translation = DeathTranslations.TranslationsById[scp._translationId]; - if (translation.Id == DeathTranslations.PocketDecay.Id) - return DamageType.Scp106; - return DamageTypeExtensions.TranslationIdConversion.ContainsKey(translation.Id) ? DamageTypeExtensions.TranslationIdConversion[translation.Id] : DamageType.Scp; - } - - default: - return base.Type; - } - } - } } } \ No newline at end of file From 9916d688eed62c2c8c2ead539e87acae81feb30f Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Sun, 8 Mar 2026 19:36:00 +0100 Subject: [PATCH 2/4] feat: MicroHid DamageType --- EXILED/Exiled.API/Enums/DamageType.cs | 15 ++++++-- .../Extensions/DamageTypeExtensions.cs | 36 +++++++++++++------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/EXILED/Exiled.API/Enums/DamageType.cs b/EXILED/Exiled.API/Enums/DamageType.cs index 5235da26b8..0cd0206b90 100644 --- a/EXILED/Exiled.API/Enums/DamageType.cs +++ b/EXILED/Exiled.API/Enums/DamageType.cs @@ -8,7 +8,6 @@ namespace Exiled.API.Enums { using Features; - using PlayerRoles; /// @@ -60,9 +59,9 @@ public enum DamageType Firearm, /// - /// Damage dealt by a . + /// Damage dealt by a when . /// - MicroHid, + MicroHidPrimaryFire, /// /// Damage dealt by a Tesla Gate. @@ -358,5 +357,15 @@ public enum DamageType /// Damage cause by the explosion of or any other not valid ExplosionType."/> /// ExplosionCustom, + + /// + /// Damage dealt by a when . + /// + MicroHidChargeFire, + + /// + /// Damage dealt by a when . + /// + MicroHidBrokenFire, } } diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 1ae5f8f88a..199697002b 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -16,6 +16,7 @@ namespace Exiled.API.Extensions using PlayerRoles; using PlayerRoles.PlayableScps.Scp1507; using PlayerRoles.PlayableScps.Scp3114; + using PlayerRoles.PlayableScps.Scp939; using PlayerStatsSystem; /// @@ -37,7 +38,7 @@ public static class DamageTypeExtensions { DeathTranslations.Poisoned, DamageType.Poison }, { DeathTranslations.Scp207, DamageType.Scp207 }, { DeathTranslations.SeveredHands, DamageType.SeveredHands }, - { DeathTranslations.MicroHID, DamageType.MicroHid }, + { DeathTranslations.MicroHID, DamageType.MicroHidPrimaryFire }, { DeathTranslations.Tesla, DamageType.Tesla }, { DeathTranslations.Explosion, DamageType.ExplosionCustom }, { DeathTranslations.Scp096, DamageType.Scp096Other }, @@ -73,7 +74,7 @@ public static class DamageTypeExtensions { ItemType.GunCOM18, DamageType.Com18 }, { ItemType.GunFSP9, DamageType.Fsp9 }, { ItemType.GunE11SR, DamageType.E11Sr }, - { ItemType.MicroHID, DamageType.MicroHid }, + { ItemType.MicroHID, DamageType.MicroHidPrimaryFire }, { ItemType.ParticleDisruptor, DamageType.ParticleDisruptor }, { ItemType.Jailbird, DamageType.Jailbird }, { ItemType.GunFRMG0, DamageType.Frmg0 }, @@ -105,7 +106,7 @@ public static class DamageTypeExtensions public static bool IsWeapon(this DamageType type, bool checkNonFirearm = true) => type switch { DamageType.Crossvec or DamageType.Logicer or DamageType.Revolver or DamageType.Shotgun or DamageType.AK or DamageType.Com15 or DamageType.Com18 or DamageType.E11Sr or DamageType.Fsp9 or DamageType.ParticleDisruptor or DamageType.Com45 or DamageType.Frmg0 or DamageType.A7 => true, - DamageType.MicroHid or DamageType.Jailbird when checkNonFirearm => true, + DamageType.MicroHidPrimaryFire or DamageType.MicroHidChargeFire or DamageType.MicroHidBrokenFire or DamageType.Jailbird when checkNonFirearm => true, _ => false, }; @@ -222,6 +223,14 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) Scp049DamageHandler.AttackType.Scp0492 => DamageType.Scp0492, _ => DamageType.Unknown, }; + case Scp939DamageHandler scp939DamageHandler: + return scp939DamageHandler.Scp939DamageType switch + { + Scp939DamageType.Claw => DamageType.Scp939Claw, + Scp939DamageType.LungeTarget => DamageType.Scp939LungeTarget, + Scp939DamageType.LungeSecondary => DamageType.Scp939LungeSecondary, + _ => DamageType.Scp939, + }; case Scp3114DamageHandler scp3114DamageHandler: return scp3114DamageHandler.Subtype switch { @@ -231,13 +240,15 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) _ => DamageType.Unknown, }; case FirearmDamageHandler firearmDamageHandler: - if (ItemConversion.ContainsKey(firearmDamageHandler.WeaponType)) - return ItemConversion[firearmDamageHandler.WeaponType]; + { + if (ItemConversion.ContainsKey(firearmDamageHandler.WeaponType)) + return ItemConversion[firearmDamageHandler.WeaponType]; - if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) - Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(ScpDamageHandler)} with ItemType {firearmDamageHandler.WeaponType}, type will be reported as {DamageType.Firearm}. Report this to EXILED Devs."); + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(ScpDamageHandler)} with ItemType {firearmDamageHandler.WeaponType}, type will be reported as {DamageType.Firearm}. Report this to EXILED Devs."); - return DamageType.Firearm; + return DamageType.Firearm; + } case ScpDamageHandler scpDamageHandler: { @@ -275,9 +286,14 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} for {nameof(AttackerDamageHandler)} with Type {attackerDamageHandler.GetType()}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); return DamageType.Unknown; } - } - return DamageType.Unknown; + default: + { + if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) + Log.Warn($"{nameof(DamageTypeExtensions)}.{nameof(damageHandlerBase)}: No matching {nameof(DamageType)} with Type {damageHandlerBase.GetType()}, type will be reported as {DamageType.Unknown}. Report this to EXILED Devs."); + return DamageType.Unknown; + } + } } } } From 4f6027dd7336cdf563f3283d59c9294360457eca Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:35:10 +0100 Subject: [PATCH 3/4] fix: MicroHid missing in merge commit --- EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs | 11 +++++++++-- .../Features/DamageHandlers/GenericDamageHandler.cs | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 199697002b..884cce911f 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -12,6 +12,7 @@ namespace Exiled.API.Extensions using Enums; using Features; + using InventorySystem.Items.MicroHID.Modules; using InventorySystem.Items.Scp1509; using PlayerRoles; using PlayerRoles.PlayableScps.Scp1507; @@ -201,8 +202,14 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) Scp096DamageHandler.AttackType.Charge => DamageType.Scp096Charge, _ => DamageType.Scp096Other, }; - case MicroHidDamageHandler: - return DamageType.MicroHid; + case MicroHidDamageHandler microHidDamageHandler: + return microHidDamageHandler.FiringMode switch + { + MicroHidFiringMode.PrimaryFire => DamageType.MicroHidPrimaryFire, + MicroHidFiringMode.ChargeFire => DamageType.MicroHidChargeFire, + MicroHidFiringMode.BrokenFire => DamageType.MicroHidBrokenFire, + _ => DamageType.Unknown, + }; case DisruptorDamageHandler: return DamageType.ParticleDisruptor; case Scp1507DamageHandler: diff --git a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs index 29783dfa94..2e202ed4dc 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs @@ -122,7 +122,9 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage case DamageType.GrayCandy: Base = new GrayCandyDamageHandler(Attacker.Hub, damage); break; - case DamageType.MicroHid: + case DamageType.MicroHidPrimaryFire: + case DamageType.MicroHidChargeFire: + case DamageType.MicroHidBrokenFire: InventorySystem.Items.MicroHID.MicroHIDItem microHidOwner = new(); microHidOwner.Owner = attacker.ReferenceHub; Base = new MicroHidDamageHandler(damage, microHidOwner); From 184a49a58685dba170901ab4ab9b103db281066e Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:39:58 +0100 Subject: [PATCH 4/4] DamageTypeExtensions.IsMicroHid --- EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 884cce911f..874753af0c 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -152,6 +152,13 @@ public static class DamageTypeExtensions /// Returns whether the is caused by SCP. public static bool IsScp3114(this DamageType type) => type is DamageType.Scp3114 or DamageType.Scp3114SkinSteal or DamageType.Strangled; + /// + /// Check if a damage type is caused by >. + /// + /// The damage type to be checked. + /// Returns whether the is caused by SCP. + public static bool IsMicroHid(this DamageType type) => type is DamageType.MicroHidPrimaryFire or DamageType.MicroHidChargeFire or DamageType.MicroHidBrokenFire; + /// /// Check if a damage type is caused by a status effect. ///