From f106fc7f1aed13b5c40f7042920e5836930856be Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:10:25 +0200 Subject: [PATCH 1/4] fix: NRE in DamageTypeExtensions.GetDamageType(DamageHandlerBase) --- EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 82a187869..123d7a157 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -298,6 +298,9 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) return DamageType.Unknown; } + case null: + return DamageType.Unknown; + default: { if (damageHandlerBase.GetType().Assembly.FullName.StartsWith("Assembly-CSharp")) From eb1d7f93608ef0d142a20a53c25fc714913b6de6 Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:10:40 +0200 Subject: [PATCH 2/4] feat: add new DamageType --- EXILED/Exiled.API/Enums/DamageType.cs | 29 +++++++++++++++++-- .../Extensions/DamageTypeExtensions.cs | 19 ++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/EXILED/Exiled.API/Enums/DamageType.cs b/EXILED/Exiled.API/Enums/DamageType.cs index b1b9c8df2..880a9bef4 100644 --- a/EXILED/Exiled.API/Enums/DamageType.cs +++ b/EXILED/Exiled.API/Enums/DamageType.cs @@ -9,6 +9,9 @@ namespace Exiled.API.Enums { using Features; + using InventorySystem.Items.Firearms.Modules; + using InventorySystem.Items.Jailbird; + using PlayerRoles; /// @@ -210,9 +213,9 @@ public enum DamageType Hypothermia, /// - /// Damage caused by . + /// Damage caused by when or Unknown. /// - ParticleDisruptor, + ParticleDisruptorNone, /// /// Damage caused by . @@ -227,7 +230,7 @@ public enum DamageType /// /// Damage caused by . /// - Jailbird, + JailbirdOther, /// /// Damage caused by . @@ -368,5 +371,25 @@ public enum DamageType /// Damage dealt by a when . /// MicroHidBrokenFire, + + /// + /// Damage caused by when . + /// + JailbirdCharged, + + /// + /// Damage caused by when swinging. + /// + JailbirdSwing, + + /// + /// Damage caused by when . + /// + ParticleDisruptorRapidShot, + + /// + /// Damage caused by when . + /// + ParticleDisruptorSingleShot, } } \ No newline at end of file diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 123d7a157..4c4839326 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -14,6 +14,9 @@ namespace Exiled.API.Extensions using Features; + using InventorySystem.Items.Firearms; + using InventorySystem.Items.Firearms.Modules; + using InventorySystem.Items.Jailbird; using InventorySystem.Items.MicroHID.Modules; using InventorySystem.Items.Scp1509; @@ -222,8 +225,20 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) MicroHidFiringMode.BrokenFire => DamageType.MicroHidBrokenFire, _ => DamageType.Unknown, }; - case DisruptorDamageHandler: - return DamageType.ParticleDisruptor; + case JailbirdDamageHandler jailbirdDamageHandler: + if (jailbirdDamageHandler.Attacker.Hub?.inventory.CurInstance is not JailbirdItem jailbirdItem) + return DamageType.JailbirdOther; + + return jailbirdItem._charging ? DamageType.JailbirdCharged : DamageType.JailbirdSwing; + + case DisruptorDamageHandler disruptorDamageHandler: + return disruptorDamageHandler.FiringState switch + { + DisruptorActionModule.FiringState.FiringRapid => DamageType.ParticleDisruptorRapidShot, + DisruptorActionModule.FiringState.FiringSingle => DamageType.ParticleDisruptorSingleShot, + DisruptorActionModule.FiringState.None => DamageType.ParticleDisruptorNone, + _ => DamageType.ParticleDisruptorNone, + }; case Scp1507DamageHandler: return DamageType.Scp1507; case Scp956DamageHandler: From 0d181588926c94edc75469239d13ab71c2bdd0ff Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Fri, 31 Jul 2026 22:04:20 +0200 Subject: [PATCH 3/4] fix: Repair all error --- .../Extensions/DamageTypeExtensions.cs | 9 ++++----- .../DamageHandlers/GenericDamageHandler.cs | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index 4c4839326..f2f9854ef 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -14,7 +14,6 @@ namespace Exiled.API.Extensions using Features; - using InventorySystem.Items.Firearms; using InventorySystem.Items.Firearms.Modules; using InventorySystem.Items.Jailbird; using InventorySystem.Items.MicroHID.Modules; @@ -83,8 +82,8 @@ public static class DamageTypeExtensions { ItemType.GunFSP9, DamageType.Fsp9 }, { ItemType.GunE11SR, DamageType.E11Sr }, { ItemType.MicroHID, DamageType.MicroHidPrimaryFire }, - { ItemType.ParticleDisruptor, DamageType.ParticleDisruptor }, - { ItemType.Jailbird, DamageType.Jailbird }, + { ItemType.ParticleDisruptor, DamageType.ParticleDisruptorNone }, + { ItemType.Jailbird, DamageType.JailbirdOther }, { ItemType.GunFRMG0, DamageType.Frmg0 }, { ItemType.GunA7, DamageType.A7 }, { ItemType.GunSCP127, DamageType.Scp127 }, @@ -114,8 +113,8 @@ 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 or DamageType.Scp127 => true, - DamageType.MicroHidPrimaryFire or DamageType.MicroHidChargeFire or DamageType.MicroHidBrokenFire or DamageType.Jailbird when checkNonFirearm => true, + 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.ParticleDisruptorNone or DamageType.ParticleDisruptorRapidShot or DamageType.ParticleDisruptorSingleShot or DamageType.Com45 or DamageType.Frmg0 or DamageType.A7 or DamageType.Scp127 => true, + DamageType.MicroHidPrimaryFire or DamageType.MicroHidChargeFire or DamageType.MicroHidBrokenFire or DamageType.JailbirdOther or DamageType.JailbirdCharged or DamageType.JailbirdSwing when checkNonFirearm => true, _ => false, }; diff --git a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs index 1ee51df09..2a9df99e9 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs @@ -29,6 +29,8 @@ namespace Exiled.API.Features.DamageHandlers using UnityEngine; + using static InventorySystem.Items.Firearms.Modules.DisruptorActionModule; + /// /// Allows generic damage to a player. /// @@ -118,7 +120,9 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage case DamageType.Recontainment: Base = new RecontainmentDamageHandler(Attacker); break; - case DamageType.Jailbird: + case DamageType.JailbirdOther: + case DamageType.JailbirdCharged: + case DamageType.JailbirdSwing: Base = new JailbirdDamageHandler(Attacker.Hub, damage, Vector3.zero); break; case DamageType.Scp1509: @@ -179,8 +183,17 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage case DamageType.Scp127: GenericFirearm(damage, ItemType.GunSCP127); break; - case DamageType.ParticleDisruptor: - Base = new DisruptorDamageHandler(new DisruptorShotEvent(default, Attacker, InventorySystem.Items.Firearms.Modules.DisruptorActionModule.FiringState.FiringSingle), Vector3.up, damage); + case DamageType.ParticleDisruptorNone: + case DamageType.ParticleDisruptorRapidShot: + case DamageType.ParticleDisruptorSingleShot: + FiringState state = damageType switch + { + DamageType.ParticleDisruptorRapidShot => FiringState.FiringRapid, + DamageType.ParticleDisruptorSingleShot => FiringState.FiringSingle, + DamageType.ParticleDisruptorNone => FiringState.None, + _ => FiringState.None, + }; + Base = new DisruptorDamageHandler(new DisruptorShotEvent(default, Attacker, state), Vector3.up, damage); break; case DamageType.Scp096Other: Scp096Role curr096 = attacker.ReferenceHub.roleManager.CurrentRole as Scp096Role ?? new Scp096Role(); From 2782730e824e1ba9f1485a5e65cd259c4b8a4376 Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Fri, 31 Jul 2026 22:40:00 +0200 Subject: [PATCH 4/4] Convert 'None' -> 'Other' --- EXILED/Exiled.API/Enums/DamageType.cs | 6 +++--- .../Exiled.API/Extensions/DamageTypeExtensions.cs | 14 +++++++------- .../DamageHandlers/GenericDamageHandler.cs | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/EXILED/Exiled.API/Enums/DamageType.cs b/EXILED/Exiled.API/Enums/DamageType.cs index 880a9bef4..3d949bde6 100644 --- a/EXILED/Exiled.API/Enums/DamageType.cs +++ b/EXILED/Exiled.API/Enums/DamageType.cs @@ -148,9 +148,9 @@ public enum DamageType Scp173, /// - /// Damage caused by with . + /// Damage caused by with or Unknown. /// - Scp939None, + Scp939Other, /// /// Damage caused by . @@ -215,7 +215,7 @@ public enum DamageType /// /// Damage caused by when or Unknown. /// - ParticleDisruptorNone, + ParticleDisruptorOther, /// /// Damage caused by . diff --git a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs index f2f9854ef..b069e85e1 100644 --- a/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs +++ b/EXILED/Exiled.API/Extensions/DamageTypeExtensions.cs @@ -82,7 +82,7 @@ public static class DamageTypeExtensions { ItemType.GunFSP9, DamageType.Fsp9 }, { ItemType.GunE11SR, DamageType.E11Sr }, { ItemType.MicroHID, DamageType.MicroHidPrimaryFire }, - { ItemType.ParticleDisruptor, DamageType.ParticleDisruptorNone }, + { ItemType.ParticleDisruptor, DamageType.ParticleDisruptorOther }, { ItemType.Jailbird, DamageType.JailbirdOther }, { ItemType.GunFRMG0, DamageType.Frmg0 }, { ItemType.GunA7, DamageType.A7 }, @@ -113,7 +113,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.ParticleDisruptorNone or DamageType.ParticleDisruptorRapidShot or DamageType.ParticleDisruptorSingleShot or DamageType.Com45 or DamageType.Frmg0 or DamageType.A7 or DamageType.Scp127 => true, + 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.ParticleDisruptorOther or DamageType.ParticleDisruptorRapidShot or DamageType.ParticleDisruptorSingleShot or DamageType.Com45 or DamageType.Frmg0 or DamageType.A7 or DamageType.Scp127 => true, DamageType.MicroHidPrimaryFire or DamageType.MicroHidChargeFire or DamageType.MicroHidBrokenFire or DamageType.JailbirdOther or DamageType.JailbirdCharged or DamageType.JailbirdSwing when checkNonFirearm => true, _ => false, }; @@ -126,7 +126,7 @@ 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.Scp096SlapLeft or DamageType.Scp096SlapRight or DamageType.Scp096Charge or DamageType.Scp096GateKill or DamageType.Scp096Other or DamageType.Scp106 or DamageType.Scp173 or DamageType.Scp939None or DamageType.Scp939Claw or DamageType.Scp939LungeTarget or DamageType.Scp939LungeSecondary or DamageType.Scp0492 or DamageType.Scp3114 or DamageType.Scp3114SkinSteal => 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.Scp939Other 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, }; @@ -143,7 +143,7 @@ public static class DamageTypeExtensions /// /// The damage type to be checked. /// Returns whether the is caused by SCP. - public static bool IsScp939(this DamageType type) => type is DamageType.Scp939None or DamageType.Scp939Claw or DamageType.Scp939LungeTarget or DamageType.Scp939LungeSecondary; + public static bool IsScp939(this DamageType type) => type is DamageType.Scp939Other or DamageType.Scp939Claw or DamageType.Scp939LungeTarget or DamageType.Scp939LungeSecondary; /// /// Check if a damage type is caused by >. @@ -235,8 +235,8 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) { DisruptorActionModule.FiringState.FiringRapid => DamageType.ParticleDisruptorRapidShot, DisruptorActionModule.FiringState.FiringSingle => DamageType.ParticleDisruptorSingleShot, - DisruptorActionModule.FiringState.None => DamageType.ParticleDisruptorNone, - _ => DamageType.ParticleDisruptorNone, + DisruptorActionModule.FiringState.None => DamageType.ParticleDisruptorOther, + _ => DamageType.ParticleDisruptorOther, }; case Scp1507DamageHandler: return DamageType.Scp1507; @@ -264,7 +264,7 @@ public static DamageType GetDamageType(DamageHandlerBase damageHandlerBase) Scp939DamageType.Claw => DamageType.Scp939Claw, Scp939DamageType.LungeTarget => DamageType.Scp939LungeTarget, Scp939DamageType.LungeSecondary => DamageType.Scp939LungeSecondary, - _ => DamageType.Scp939None, + _ => DamageType.Scp939Other, }; case Scp3114DamageHandler scp3114DamageHandler: return scp3114DamageHandler.Subtype switch diff --git a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs index 2a9df99e9..8d79de4b1 100644 --- a/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs +++ b/EXILED/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs @@ -183,14 +183,14 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage case DamageType.Scp127: GenericFirearm(damage, ItemType.GunSCP127); break; - case DamageType.ParticleDisruptorNone: + case DamageType.ParticleDisruptorOther: case DamageType.ParticleDisruptorRapidShot: case DamageType.ParticleDisruptorSingleShot: FiringState state = damageType switch { DamageType.ParticleDisruptorRapidShot => FiringState.FiringRapid, DamageType.ParticleDisruptorSingleShot => FiringState.FiringSingle, - DamageType.ParticleDisruptorNone => FiringState.None, + DamageType.ParticleDisruptorOther => FiringState.None, _ => FiringState.None, }; Base = new DisruptorDamageHandler(new DisruptorShotEvent(default, Attacker, state), Vector3.up, damage); @@ -202,7 +202,7 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage Base = new Scp096DamageHandler(curr096, damage, Scp096DamageHandler.AttackType.SlapRight); break; - case DamageType.Scp939None: + case DamageType.Scp939Other: Scp939Role curr939 = attacker.ReferenceHub.roleManager.CurrentRole as Scp939Role ?? new Scp939Role(); curr939?._lastOwner = attacker.ReferenceHub;