diff --git a/EXILED.props b/EXILED.props index 6798a36303..c6717e4a2e 100644 --- a/EXILED.props +++ b/EXILED.props @@ -15,12 +15,11 @@ - 6.0.5 + 8.0.0 false 2.2.2 - 12.0.2 1.1.118 2.0.2 diff --git a/EXILED.sln b/EXILED.sln index 6ad36ae9d7..4f89a807ef 100644 --- a/EXILED.sln +++ b/EXILED.sln @@ -23,6 +23,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Exiled.CreditTags", "Exiled EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Exiled.CustomRoles", "Exiled.CustomRoles\Exiled.CustomRoles.csproj", "{417C3309-8B93-4218-A1D1-D4BB7B09BE0F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "docs", "docs\docs.csproj", "{33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}" + ProjectSection(ProjectDependencies) = postProject + {10A8BFEC-B9E2-4119-BB21-2CF1EA820D19} = {10A8BFEC-B9E2-4119-BB21-2CF1EA820D19} + {1ABEC6CE-E209-4C38-AB45-2F3B7F6091CA} = {1ABEC6CE-E209-4C38-AB45-2F3B7F6091CA} + {1E6C4350-5067-4CE7-91DB-6420D027A4FC} = {1E6C4350-5067-4CE7-91DB-6420D027A4FC} + {417C3309-8B93-4218-A1D1-D4BB7B09BE0F} = {417C3309-8B93-4218-A1D1-D4BB7B09BE0F} + {46A0AFA9-D73A-4131-93EA-0CA7B7A1A101} = {46A0AFA9-D73A-4131-93EA-0CA7B7A1A101} + {4F183633-0A36-408C-A42E-6FBA48751054} = {4F183633-0A36-408C-A42E-6FBA48751054} + {4FFB9CEB-2956-4F62-88B3-6416DB8A8ED7} = {4FFB9CEB-2956-4F62-88B3-6416DB8A8ED7} + {9FEBCAEA-EB51-46D0-BC04-F74789A40079} = {9FEBCAEA-EB51-46D0-BC04-F74789A40079} + {B7FBA3C1-6182-4E96-A33B-053EDDCC4F65} = {B7FBA3C1-6182-4E96-A33B-053EDDCC4F65} + {DFED2F89-8C43-40AE-84FF-8A0057D2FA5A} = {DFED2F89-8C43-40AE-84FF-8A0057D2FA5A} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -81,6 +95,12 @@ Global {417C3309-8B93-4218-A1D1-D4BB7B09BE0F}.Installer|Any CPU.ActiveCfg = Installer|Any CPU {417C3309-8B93-4218-A1D1-D4BB7B09BE0F}.Release|Any CPU.ActiveCfg = Release|Any CPU {417C3309-8B93-4218-A1D1-D4BB7B09BE0F}.Release|Any CPU.Build.0 = Release|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Installer|Any CPU.ActiveCfg = Debug|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Installer|Any CPU.Build.0 = Debug|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33EEFAC8-F5A7-4E51-8FD1-C45D25268B4A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Exiled.API/Enums/AuthenticationType.cs b/Exiled.API/Enums/AuthenticationType.cs index f2fc234fca..f58b5afb6a 100644 --- a/Exiled.API/Enums/AuthenticationType.cs +++ b/Exiled.API/Enums/AuthenticationType.cs @@ -7,6 +7,8 @@ namespace Exiled.API.Enums { + using System; + /// /// Players authentication types. /// @@ -29,13 +31,18 @@ public enum AuthenticationType Northwood, /// - /// Indicates that the player has been authenticated as a Patreon. + /// Indicates that the player has been authenticated through an unknown provider. /// - Patreon, + Unknown, /// - /// Indicates that the player has been authenticated through an unknown provider. + /// Indicates that the player has been authenticated as localhost. /// - Unknown, + LocalHost, + + /// + /// Indicates that the player has been authenticated as DedicatedServer. + /// + DedicatedServer, } } \ No newline at end of file diff --git a/Exiled.API/Enums/CameraType.cs b/Exiled.API/Enums/CameraType.cs index 6b8aa5c85a..121e880888 100644 --- a/Exiled.API/Enums/CameraType.cs +++ b/Exiled.API/Enums/CameraType.cs @@ -11,6 +11,8 @@ namespace Exiled.API.Enums { + using System; + using Features; /// @@ -18,6 +20,7 @@ namespace Exiled.API.Enums /// /// /// + /// public enum CameraType { /// @@ -44,12 +47,11 @@ public enum CameraType #endregion #region Hcz - Hcz049Armory, Hcz049ContChamber, Hcz049ElevTop, Hcz049Hallway, Hcz049TopFloor, - Hcz049Tunnel, + Hcz049Outside, Hcz079Airlock, Hcz079ContChamber, Hcz079Hallway, @@ -122,5 +124,13 @@ public enum CameraType SurfaceBridge, TunnelEntrance, #endregion + + #region new + Hcz173Outside, + Hcz173Stairs, + Hcz173ContChamber, + Hcz173Hallway, + HczCurve, + #endregion } -} \ No newline at end of file +} diff --git a/Exiled.API/Enums/DoorBeepType.cs b/Exiled.API/Enums/DoorBeepType.cs index 0f240f0108..59760b8880 100644 --- a/Exiled.API/Enums/DoorBeepType.cs +++ b/Exiled.API/Enums/DoorBeepType.cs @@ -7,10 +7,12 @@ namespace Exiled.API.Enums { + using Exiled.API.Features.Doors; + /// /// Door beep types. /// - /// + /// public enum DoorBeepType { /// diff --git a/Exiled.API/Enums/DoorLockType.cs b/Exiled.API/Enums/DoorLockType.cs index 48683578f4..def03de7ad 100644 --- a/Exiled.API/Enums/DoorLockType.cs +++ b/Exiled.API/Enums/DoorLockType.cs @@ -9,6 +9,7 @@ namespace Exiled.API.Enums { using System; + using Exiled.API.Features.Doors; using Features; /// diff --git a/Exiled.API/Enums/DoorType.cs b/Exiled.API/Enums/DoorType.cs index a4575e7c62..0feb0ffa7f 100644 --- a/Exiled.API/Enums/DoorType.cs +++ b/Exiled.API/Enums/DoorType.cs @@ -7,13 +7,15 @@ namespace Exiled.API.Enums { + using Exiled.API.Features.Doors; + using static Interactables.Interobjects.ElevatorManager; /// /// Unique identifier for the different types of doors. /// - /// - /// + /// + /// public enum DoorType { /// @@ -57,9 +59,9 @@ public enum DoorType Scp096, /// - /// Represents the 106_BOTTOM door. + /// Represents the 079_ARMORY door. /// - Scp106Bottom, + Scp079Armory, /// /// Represents the 106_PRIMARY door. @@ -72,7 +74,7 @@ public enum DoorType Scp106Secondary, /// - /// Represents the 173 gate. + /// Represents the 173_GATE door. /// Scp173Gate, @@ -300,5 +302,10 @@ public enum DoorType /// Represents the door inside with component. /// Airlock, + + /// + /// Represents the New Gate where Scp173 spawn in the . + /// + Scp173NewGate, } } \ No newline at end of file diff --git a/Exiled.API/Enums/EffectType.cs b/Exiled.API/Enums/EffectType.cs index d94df05ece..1142907162 100644 --- a/Exiled.API/Enums/EffectType.cs +++ b/Exiled.API/Enums/EffectType.cs @@ -51,7 +51,7 @@ public enum EffectType Concussed, /// - /// Teleports the player to the pocket dimension and drains health until the player escapes or is killed. + /// Effect given to player after being hurt by SCP-106. /// Corroding, @@ -171,7 +171,7 @@ public enum EffectType InsufficientLighting, /// - /// Disable ambiant sound. + /// Disable ambient sound. /// SoundtrackMute, @@ -184,5 +184,20 @@ public enum EffectType /// Make Scp106 able to see you when he are in the ground (stalking). /// Traumatized, + + /// + /// Same effect as Scp207, but Healing instead of Hurting. + /// + AntiScp207, + + /// + /// The effect that SCP-079 gives the Scanned player with the Breach Scanner. + /// + Scanned, + + /// + /// Teleports the player to the pocket dimension and drains health until the player escapes or is killed. + /// + PocketCorroding, } -} \ No newline at end of file +} diff --git a/Exiled.API/Enums/HotkeyButton.cs b/Exiled.API/Enums/EscapeScenario.cs similarity index 51% rename from Exiled.API/Enums/HotkeyButton.cs rename to Exiled.API/Enums/EscapeScenario.cs index ebff9473e7..b02058ccdd 100644 --- a/Exiled.API/Enums/HotkeyButton.cs +++ b/Exiled.API/Enums/EscapeScenario.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -8,33 +8,38 @@ namespace Exiled.API.Enums { /// - /// Hotkey button types. + /// A set of different Escape Scenario Type. /// - public enum HotkeyButton + public enum EscapeScenario { /// - /// The hotkey button for selecting the keycard. + /// No Escape Scenario. /// - Keycard = 0, + None, /// - /// The hotkey button for selecting the primary firearm. + /// ClassD Escape Scenario. /// - PrimaryFirearm = 1, + ClassD, /// - /// The hotkey button for selecting the secondary firearm. + /// Cuffed ClassD Escape. /// - SecondaryFirearm = 2, + CuffedClassD, /// - /// The hotkey button for selecting the medical item. + /// Scientist Escape. /// - Medical = 3, + Scientist, /// - /// The hotkey button for selecting the grenade. + /// Cuffed Scientist Escape. /// - Grenade = 4, + CuffedScientist, + + /// + /// Unspecified Escape. + /// + CustomEscape, } } \ No newline at end of file diff --git a/Exiled.API/Enums/FirearmType.cs b/Exiled.API/Enums/FirearmType.cs index 0e5fa3bd5b..d871fe9b23 100644 --- a/Exiled.API/Enums/FirearmType.cs +++ b/Exiled.API/Enums/FirearmType.cs @@ -79,5 +79,15 @@ public enum FirearmType /// Represents the . /// ParticleDisruptor, + + /// + /// Represents the . + /// + FRMG0, + + /// + /// Represents the . + /// + A7, } } diff --git a/Exiled.API/Enums/RoomType.cs b/Exiled.API/Enums/RoomType.cs index d510cd22e7..ea7f6ad4ac 100644 --- a/Exiled.API/Enums/RoomType.cs +++ b/Exiled.API/Enums/RoomType.cs @@ -34,12 +34,6 @@ public enum RoomType /// LczStraight, - /// - /// Lower Containment SCP-012 Room. - /// - [System.Obsolete("This room do not Exist", true)] - Lcz012, - /// /// Lower Containment SCP-914 Room. /// diff --git a/Exiled.API/Enums/SpawnLocationType.cs b/Exiled.API/Enums/SpawnLocationType.cs index 8ecaf09dd8..b57666fff3 100644 --- a/Exiled.API/Enums/SpawnLocationType.cs +++ b/Exiled.API/Enums/SpawnLocationType.cs @@ -7,30 +7,27 @@ namespace Exiled.API.Enums { + using System; + /// /// All of the valid spawn location types. /// public enum SpawnLocationType { /// - /// The inside of 012's hallway door. - /// - Inside012, - - /// - /// The inside of the locked door leaving to SCP-012's room. + /// The inside of 330's room. /// - Inside012Bottom, + Inside330, /// - /// The inside of the locked 012 armory door. + /// The inside of 330's room test chamber. /// - Inside012Locker, + Inside330Chamber, /// /// The inside of SCP-049's Armory room. /// - Inside049Armory, + Inside049Armory = 3, /// /// The inside of the inner SCP-079 door. diff --git a/Exiled.API/Enums/SpawnReason.cs b/Exiled.API/Enums/SpawnReason.cs index 253779c362..d5ab04e202 100644 --- a/Exiled.API/Enums/SpawnReason.cs +++ b/Exiled.API/Enums/SpawnReason.cs @@ -10,7 +10,7 @@ namespace Exiled.API.Enums /// /// Possible spawn reasons. /// - public enum SpawnReason : byte + public enum SpawnReason : byte // TOTO: Remove this file and use Basegame { /// /// No reason specified. diff --git a/Exiled.API/Enums/ZoneType.cs b/Exiled.API/Enums/ZoneType.cs index ccb18c12ef..126757de9f 100644 --- a/Exiled.API/Enums/ZoneType.cs +++ b/Exiled.API/Enums/ZoneType.cs @@ -9,6 +9,7 @@ namespace Exiled.API.Enums { using System; + using Exiled.API.Features.Doors; using Features; /// diff --git a/Exiled.API/Exiled.API.csproj b/Exiled.API/Exiled.API.csproj index 9fbb520857..e0949b7fff 100644 --- a/Exiled.API/Exiled.API.csproj +++ b/Exiled.API/Exiled.API.csproj @@ -19,7 +19,6 @@ - @@ -29,12 +28,17 @@ + + + $(EXILED_REFERENCES)\UnityEngine.ParticleSystemModule.dll + + diff --git a/Exiled.API/Extensions/DoorTypeExtensions.cs b/Exiled.API/Extensions/DoorTypeExtensions.cs index d86eb0f123..c4b512dd13 100644 --- a/Exiled.API/Extensions/DoorTypeExtensions.cs +++ b/Exiled.API/Extensions/DoorTypeExtensions.cs @@ -9,8 +9,6 @@ namespace Exiled.API.Extensions { using Exiled.API.Enums; - using MapGeneration; - /// /// A set of extensions for . /// diff --git a/Exiled.API/Extensions/EffectTypeExtension.cs b/Exiled.API/Extensions/EffectTypeExtension.cs index 8abd6ecd0c..b083f8042a 100644 --- a/Exiled.API/Extensions/EffectTypeExtension.cs +++ b/Exiled.API/Extensions/EffectTypeExtension.cs @@ -38,6 +38,7 @@ public static class EffectTypeExtension EffectType.Burned => typeof(Burned), EffectType.CardiacArrest => typeof(CardiacArrest), EffectType.Concussed => typeof(Concussed), + EffectType.PocketCorroding => typeof(PocketCorroding), EffectType.Corroding => typeof(Corroding), EffectType.DamageReduction => typeof(DamageReduction), EffectType.Deafened => typeof(Deafened), @@ -63,11 +64,62 @@ public static class EffectTypeExtension EffectType.SoundtrackMute => typeof(SoundtrackMute), EffectType.SpawnProtected => typeof(SpawnProtected), EffectType.Traumatized => typeof(Traumatized), + EffectType.AntiScp207 => typeof(AntiScp207), + EffectType.Scanned => typeof(Scanned), // This should never happen _ => throw new InvalidOperationException("Invalid effect enum provided"), }; + /// + /// Gets the of the specified . + /// + /// The enum. + /// The . + public static EffectType GetEffectType(this StatusEffectBase statusEffectBase) => statusEffectBase switch + { + AmnesiaItems => EffectType.AmnesiaItems, + AmnesiaVision => EffectType.AmnesiaVision, + Asphyxiated => EffectType.Asphyxiated, + Bleeding => EffectType.Bleeding, + Blinded => EffectType.Blinded, + BodyshotReduction => EffectType.BodyshotReduction, + Burned => EffectType.Burned, + CardiacArrest => EffectType.CardiacArrest, + Concussed => EffectType.Concussed, + PocketCorroding => EffectType.PocketCorroding, + Corroding => EffectType.Corroding, + DamageReduction => EffectType.DamageReduction, + Deafened => EffectType.Deafened, + Decontaminating => EffectType.Decontaminating, + Disabled => EffectType.Disabled, + Ensnared => EffectType.Ensnared, + Exhausted => EffectType.Exhausted, + Flashed => EffectType.Flashed, + Hemorrhage => EffectType.Hemorrhage, + Hypothermia => EffectType.Hypothermia, + InsufficientLighting => EffectType.InsufficientLighting, + Invigorated => EffectType.Invigorated, + Invisible => EffectType.Invisible, + MovementBoost => EffectType.MovementBoost, + Poisoned => EffectType.Poisoned, + RainbowTaste => EffectType.RainbowTaste, + Scp207 => EffectType.Scp207, + Scp1853 => EffectType.Scp1853, + SeveredHands => EffectType.SeveredHands, + Sinkhole => EffectType.SinkHole, + Stained => EffectType.Stained, + Vitality => EffectType.Vitality, + SoundtrackMute => EffectType.SoundtrackMute, + SpawnProtected => EffectType.SpawnProtected, + Traumatized => EffectType.Traumatized, + AntiScp207 => EffectType.AntiScp207, + Scanned => EffectType.Scanned, + + // This should never happen + _ => throw new InvalidOperationException("Invalid effect status base provided"), + }; + /// /// Returns whether or not the provided drains health over time. /// @@ -95,7 +147,7 @@ or EffectType.Corroding or EffectType.Decontaminating or EffectType.Hemorrhage o public static bool IsNegative(this EffectType effect) => IsHarmful(effect) || effect is EffectType.AmnesiaItems or EffectType.AmnesiaVision or EffectType.Blinded or EffectType.Burned or EffectType.Concussed or EffectType.Deafened or EffectType.Disabled or EffectType.Ensnared or EffectType.Exhausted or EffectType.Flashed or EffectType.SinkHole - or EffectType.Stained or EffectType.InsufficientLighting or EffectType.SoundtrackMute; + or EffectType.Stained or EffectType.InsufficientLighting or EffectType.SoundtrackMute or EffectType.Scanned; /// /// Returns whether or not the provided is a positive effect. @@ -105,7 +157,7 @@ or EffectType.Disabled or EffectType.Ensnared or EffectType.Exhausted or EffectT /// public static bool IsPositive(this EffectType effect) => effect is EffectType.BodyshotReduction or EffectType.DamageReduction or EffectType.Invigorated or EffectType.Invisible or EffectType.MovementBoost or EffectType.RainbowTaste - or EffectType.Scp207 or EffectType.Scp1853 or EffectType.Vitality; + or EffectType.Scp207 or EffectType.Scp1853 or EffectType.Vitality or EffectType.AntiScp207; /// /// Returns whether or not the provided affects the player's movement speed. @@ -141,4 +193,4 @@ public static EffectCategory GetCategories(this EffectType effect) return category; } } -} \ No newline at end of file +} diff --git a/Exiled.API/Extensions/ItemExtensions.cs b/Exiled.API/Extensions/ItemExtensions.cs index b3b4c1c395..0fda1197e9 100644 --- a/Exiled.API/Extensions/ItemExtensions.cs +++ b/Exiled.API/Extensions/ItemExtensions.cs @@ -46,7 +46,7 @@ public static class ItemExtensions /// /// The item to be checked. /// Returns whether or not the is an SCP. - public static bool IsScp(this ItemType type) => type is ItemType.SCP018 or ItemType.SCP500 or ItemType.SCP268 or ItemType.SCP207 or ItemType.SCP244a or ItemType.SCP244b or ItemType.SCP2176 or ItemType.SCP1853; + public static bool IsScp(this ItemType type) => GetCategory(type) == ItemCategory.SCPItem; /// /// Check if an item is a throwable item. @@ -60,7 +60,7 @@ public static class ItemExtensions /// /// The item to be checked. /// Returns whether or not the is a medical item. - public static bool IsMedical(this ItemType type) => type is ItemType.Painkillers or ItemType.Medkit or ItemType.SCP500 or ItemType.Adrenaline; + public static bool IsMedical(this ItemType type) => GetCategory(type) == ItemCategory.Medical; /// /// Check if an item is a utility item. @@ -74,17 +74,14 @@ public static class ItemExtensions /// /// The item to be checked. /// Returns whether or not the is an armor. - public static bool IsArmor(this ItemType type) => type is ItemType.ArmorCombat or ItemType.ArmorHeavy or ItemType.ArmorLight; + public static bool IsArmor(this ItemType type) => GetCategory(type) == ItemCategory.Armor; /// /// Check if an item is a keycard. /// /// The item to be checked. /// Returns whether or not the is a keycard. - public static bool IsKeycard(this ItemType type) => type is ItemType.KeycardJanitor or ItemType.KeycardScientist or - ItemType.KeycardResearchCoordinator or ItemType.KeycardZoneManager or ItemType.KeycardGuard or ItemType.KeycardNTFOfficer or - ItemType.KeycardContainmentEngineer or ItemType.KeycardNTFLieutenant or ItemType.KeycardNTFCommander or - ItemType.KeycardFacilityManager or ItemType.KeycardChaosInsurgency or ItemType.KeycardO5; + public static bool IsKeycard(this ItemType type) => GetCategory(type) == ItemCategory.Keycard; /// /// Given an , returns the matching . @@ -135,8 +132,8 @@ public static byte GetMaxAmmo(this FirearmType item) public static AmmoType GetWeaponAmmoType(this FirearmType type) => type switch { FirearmType.Com15 or FirearmType.Com18 or FirearmType.Com45 or FirearmType.Crossvec or FirearmType.FSP9 => AmmoType.Nato9, - FirearmType.E11SR => AmmoType.Nato556, - FirearmType.AK or FirearmType.Logicer => AmmoType.Nato762, + FirearmType.E11SR or FirearmType.FRMG0 => AmmoType.Nato556, + FirearmType.A7 or FirearmType.AK or FirearmType.Logicer => AmmoType.Nato762, FirearmType.Revolver => AmmoType.Ammo44Cal, FirearmType.Shotgun => AmmoType.Ammo12Gauge, _ => AmmoType.None, @@ -172,8 +169,10 @@ public static byte GetMaxAmmo(this FirearmType item) ItemType.GunLogicer => FirearmType.Logicer, ItemType.GunRevolver => FirearmType.Revolver, ItemType.GunAK => FirearmType.AK, + ItemType.GunA7 => FirearmType.A7, ItemType.GunShotgun => FirearmType.Shotgun, ItemType.GunCom45 => FirearmType.Com45, + ItemType.GunFRMG0 => FirearmType.FRMG0, ItemType.ParticleDisruptor => FirearmType.ParticleDisruptor, _ => FirearmType.None, }; @@ -208,8 +207,10 @@ public static byte GetMaxAmmo(this FirearmType item) FirearmType.Logicer => ItemType.GunLogicer, FirearmType.Revolver => ItemType.GunRevolver, FirearmType.AK => ItemType.GunAK, + FirearmType.A7 => ItemType.GunA7, FirearmType.Shotgun => ItemType.GunShotgun, FirearmType.Com45 => ItemType.GunCom45, + FirearmType.FRMG0 => ItemType.GunFRMG0, FirearmType.ParticleDisruptor => ItemType.ParticleDisruptor, _ => ItemType.None, }; @@ -308,5 +309,12 @@ public static uint GetBaseCode(this FirearmType type) else throw new KeyNotFoundException($"Basecode for weapon {type} not found! Stored BaseCodesValue:\n{Firearm.BaseCodesValue.Keys.ToString(true)}\n{Firearm.BaseCodesValue.Values.ToString(true)}"); } + + /// + /// Gets the of the specified . + /// + /// The to check. + /// of the specified . + public static ItemCategory GetCategory(this ItemType type) => GetItemBase(type).Category; } -} \ No newline at end of file +} diff --git a/Exiled.API/Extensions/MirrorExtensions.cs b/Exiled.API/Extensions/MirrorExtensions.cs index eaa2cf07cc..193a9c9633 100644 --- a/Exiled.API/Extensions/MirrorExtensions.cs +++ b/Exiled.API/Extensions/MirrorExtensions.cs @@ -13,6 +13,7 @@ namespace Exiled.API.Extensions using System.Linq; using System.Reflection; using System.Reflection.Emit; + using System.Runtime.Remoting.Messaging; using System.Text; using Features; @@ -23,7 +24,9 @@ namespace Exiled.API.Extensions using Mirror; using PlayerRoles; - + using PlayerRoles.FirstPersonControl; + using PlayerRoles.PlayableScps.Scp049.Zombies; + using PluginAPI.Events; using RelativePositioning; using Respawning; @@ -37,10 +40,13 @@ public static class MirrorExtensions { private static readonly Dictionary WriterExtensionsValue = new(); private static readonly Dictionary SyncVarDirtyBitsValue = new(); + private static readonly Dictionary RpcFullNamesValue = new(); private static readonly ReadOnlyDictionary ReadOnlyWriterExtensionsValue = new(WriterExtensionsValue); private static readonly ReadOnlyDictionary ReadOnlySyncVarDirtyBitsValue = new(SyncVarDirtyBitsValue); + private static readonly ReadOnlyDictionary ReadOnlyRpcFullNamesValue = new(RpcFullNamesValue); private static MethodInfo setDirtyBitsMethodInfoValue; private static MethodInfo sendSpawnMessageMethodInfoValue; + private static MethodInfo bufferRpcMethodInfoValue; /// /// Gets corresponding to . @@ -54,7 +60,8 @@ public static ReadOnlyDictionary WriterExtensions foreach (MethodInfo method in typeof(NetworkWriterExtensions).GetMethods().Where(x => !x.IsGenericMethod && (x.GetParameters()?.Length == 2))) WriterExtensionsValue.Add(method.GetParameters().First(x => x.ParameterType != typeof(NetworkWriter)).ParameterType, method); - foreach (MethodInfo method in typeof(GeneratedNetworkCode).GetMethods().Where(x => !x.IsGenericMethod && (x.GetParameters()?.Length == 2) && (x.ReturnType == typeof(void)))) + Type fuckNorthwood = Assembly.GetAssembly(typeof(RoleTypeId)).GetType("Mirror.GeneratedNetworkCode"); + foreach (MethodInfo method in fuckNorthwood.GetMethods().Where(x => !x.IsGenericMethod && (x.GetParameters()?.Length == 2) && (x.ReturnType == typeof(void)))) WriterExtensionsValue.Add(method.GetParameters().First(x => x.ParameterType != typeof(NetworkWriter)).ParameterType, method); foreach (Type serializer in typeof(ServerConsole).Assembly.GetTypes().Where(x => x.Name.EndsWith("Serializer"))) @@ -93,8 +100,8 @@ public static ReadOnlyDictionary SyncVarDirtyBits byte[] bytecodes = methodBody.GetILAsByteArray(); - if (!SyncVarDirtyBitsValue.ContainsKey($"{property.Name}")) - SyncVarDirtyBitsValue.Add($"{property.Name}", bytecodes[bytecodes.LastIndexOf((byte)OpCodes.Ldc_I8.Value) + 1]); + if (!SyncVarDirtyBitsValue.ContainsKey($"{property.ReflectedType.Name}.{property.Name}")) + SyncVarDirtyBitsValue.Add($"{property.ReflectedType.Name}.{property.Name}", bytecodes[bytecodes.LastIndexOf((byte)OpCodes.Ldc_I8.Value) + 1]); } } @@ -103,15 +110,49 @@ public static ReadOnlyDictionary SyncVarDirtyBits } /// - /// Gets a 's . + /// Gets Rpc's FullName corresponding to (format:classname.methodname). /// - public static MethodInfo SetDirtyBitsMethodInfo => setDirtyBitsMethodInfoValue ??= typeof(NetworkBehaviour).GetMethod(nameof(NetworkBehaviour.SetDirtyBit)); + public static ReadOnlyDictionary RpcFullNames + { + get + { + if (RpcFullNamesValue.Count == 0) + { + foreach (MethodInfo method in typeof(ServerConsole).Assembly.GetTypes() + .SelectMany(x => x.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + .Where(m => m.GetCustomAttributes(typeof(ClientRpcAttribute), false).Length > 0 || m.GetCustomAttributes(typeof(TargetRpcAttribute), false).Length > 0)) + { + MethodBody methodBody = method.GetMethodBody(); + + if (methodBody is null) + continue; + + byte[] bytecodes = methodBody.GetILAsByteArray(); + + if (!RpcFullNamesValue.ContainsKey($"{method.ReflectedType.Name}.{method.Name}")) + RpcFullNamesValue.Add($"{method.ReflectedType.Name}.{method.Name}", method.Module.ResolveString(BitConverter.ToInt32(bytecodes, bytecodes.LastIndexOf((byte)OpCodes.Ldstr.Value) + 1))); + } + } + + return ReadOnlyRpcFullNamesValue; + } + } + + /// + /// Gets a 's . + /// + public static MethodInfo SetDirtyBitsMethodInfo => setDirtyBitsMethodInfoValue ??= typeof(NetworkBehaviour).GetMethod(nameof(NetworkBehaviour.SetSyncVarDirtyBit)); /// /// Gets a NetworkServer.SendSpawnMessage's . /// public static MethodInfo SendSpawnMessageMethodInfo => sendSpawnMessageMethodInfoValue ??= typeof(NetworkServer).GetMethod("SendSpawnMessage", BindingFlags.NonPublic | BindingFlags.Static); + /// + /// Gets a NetworkConnectionToClient.BufferRpc's . + /// + public static MethodInfo BufferRpcMethodInfo => bufferRpcMethodInfoValue ??= typeof(NetworkConnectionToClient).GetMethod("BufferRpc", BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.HasThis, new Type[] { typeof(RpcMessage), typeof(int) }, null); + /// /// Plays a beep sound that only the target can hear. /// @@ -156,8 +197,8 @@ public static void PlayGunSound(this Player player, Vector3 position, ItemType i /// Color to set. public static void SetRoomColorForTargetOnly(this Room room, Player target, Color color) { - target.SendFakeSyncVar(room.FlickerableLightControllerNetIdentity, typeof(FlickerableLightController), nameof(FlickerableLightController.Network_warheadLightColor), color); - target.SendFakeSyncVar(room.FlickerableLightControllerNetIdentity, typeof(FlickerableLightController), nameof(FlickerableLightController.Network_warheadLightOverride), true); + target.SendFakeSyncVar(room.RoomLightControllerNetIdentity, typeof(RoomLightController), nameof(RoomLightController.NetworkOverrideColor), color); + target.SendFakeSyncVar(room.RoomLightControllerNetIdentity, typeof(RoomLightController), nameof(RoomLightController.NetworkOverrideColor), true); } /// @@ -172,14 +213,13 @@ public static void SetName(this Player target, Player player, string name) } /// - /// Sets of a that only the player can see. + /// Sets of a that only the player can see. /// /// Room to modify. /// Only this player can see room color. /// Light intensity multiplier to set. public static void SetRoomLightIntensityForTargetOnly(this Room room, Player target, float multiplier) { - target.SendFakeSyncVar(room.FlickerableLightControllerNetIdentity, typeof(FlickerableLightController), nameof(FlickerableLightController.Network_lightIntensityMultiplier), multiplier); } /// @@ -188,10 +228,71 @@ public static void SetRoomLightIntensityForTargetOnly(this Room room, Player tar /// /// Player to change. /// Model type. - public static void ChangeAppearance(this Player player, RoleTypeId type) + /// Whether or not to skip the little jump that works around an invisibility issue. + /// The UnitNameId to use for the player's new role, if the player's new role uses unit names. (is NTF). + public static void ChangeAppearance(this Player player, RoleTypeId type, bool skipJump = false, byte unitId = 0) => ChangeAppearance(player, type, Player.List.Where(x => x != player), skipJump, unitId); + + /// + /// Change character model for appearance. + /// It will continue until 's changes. + /// + /// Player to change. + /// Model type. + /// The players who should see the changed appearance. + /// Whether or not to skip the little jump that works around an invisibility issue. + /// The UnitNameId to use for the player's new role, if the player's new role uses unit names. (is NTF). + public static void ChangeAppearance(this Player player, RoleTypeId type, IEnumerable playersToAffect, bool skipJump = false, byte unitId = 0) { - foreach (Player target in Player.List.Where(x => x != player)) - target.Connection.Send(new RoleSyncInfo(player.ReferenceHub, type, target.ReferenceHub)); + if (!RoleExtensions.TryGetRoleBase(type, out PlayerRoleBase roleBase)) + return; + + bool isRisky = type.GetTeam() is Team.Dead || player.IsDead; + + NetworkWriterPooled writer = NetworkWriterPool.Get(); + writer.WriteUShort(38952); + writer.WriteUInt(player.NetId); + writer.WriteRoleType(type); + + if (roleBase is HumanRole humanRole && humanRole.UsesUnitNames) + { + if (player.Role.Base is not HumanRole) + isRisky = true; + writer.WriteByte(unitId); + } + + if (roleBase is FpcStandardRoleBase fpc) + { + if (player.Role.Base is not FpcStandardRoleBase playerfpc) + isRisky = true; + else + fpc = playerfpc; + + fpc.FpcModule.MouseLook.GetSyncValues(0, out ushort value, out ushort _); + writer.WriteRelativePosition(player.RelativePosition); + writer.WriteUShort(value); + } + + if (roleBase is ZombieRole) + { + if (player.Role.Base is not ZombieRole) + isRisky = true; + + writer.WriteUShort((ushort)Mathf.Clamp(Mathf.CeilToInt(player.MaxHealth), ushort.MinValue, ushort.MaxValue)); + } + + foreach (Player target in playersToAffect) + { + if (target != player || !isRisky) + target.Connection.Send(writer.ToArraySegment()); + else + Log.Error($"Prevent Seld-Desync of {player.Nickname} with {type}"); + } + + NetworkWriterPool.Return(writer); + + // To counter a bug that makes the player invisible until they move after changing their appearance, we will teleport them upwards slightly to force a new position update for all clients. + if (!skipJump) + player.Position += Vector3.up * 0.25f; } /// @@ -253,20 +354,22 @@ public static void MessageTranslated(this Player player, string words, string tr /// Value of send to target. public static void SendFakeSyncVar(this Player target, NetworkIdentity behaviorOwner, Type targetType, string propertyName, object value) { + NetworkWriterPooled writer = NetworkWriterPool.Get(); + NetworkWriterPooled writer2 = NetworkWriterPool.Get(); + MakeCustomSyncWriter(behaviorOwner, targetType, null, CustomSyncVarGenerator, writer, writer2); + target.Connection.Send(new EntityStateMessage + { + netId = behaviorOwner.netId, + payload = writer.ToArraySegment(), + }); + + NetworkWriterPool.Return(writer); + NetworkWriterPool.Return(writer2); void CustomSyncVarGenerator(NetworkWriter targetWriter) { - targetWriter.WriteUInt64(SyncVarDirtyBits[propertyName]); - WriterExtensions[value.GetType()]?.Invoke(null, new[] { targetWriter, value }); + targetWriter.WriteULong(SyncVarDirtyBits[$"{targetType.Name}.{propertyName}"]); + WriterExtensions[value.GetType()]?.Invoke(null, new object[2] { targetWriter, value }); } - - PooledNetworkWriter writer = NetworkWriterPool.GetWriter(); - PooledNetworkWriter writer2 = NetworkWriterPool.GetWriter(); - - MakeCustomSyncWriter(behaviorOwner, targetType, null, CustomSyncVarGenerator, writer, writer2); - target.ReferenceHub.networkIdentity.connectionToClient.Send(new UpdateVarsMessage() { netId = behaviorOwner.netId, payload = writer.ToArraySegment() }); - - NetworkWriterPool.Recycle(writer); - NetworkWriterPool.Recycle(writer2); } /// @@ -287,7 +390,7 @@ void CustomSyncVarGenerator(NetworkWriter targetWriter) /// Values of send to target. public static void SendFakeTargetRpc(Player target, NetworkIdentity behaviorOwner, Type targetType, string rpcName, params object[] values) { - PooledNetworkWriter writer = NetworkWriterPool.GetWriter(); + NetworkWriterPooled writer = NetworkWriterPool.Get(); foreach (object value in values) WriterExtensions[value.GetType()].Invoke(null, new[] { writer, value }); @@ -295,14 +398,14 @@ public static void SendFakeTargetRpc(Player target, NetworkIdentity behaviorOwne RpcMessage msg = new() { netId = behaviorOwner.netId, - componentIndex = GetComponentIndex(behaviorOwner, targetType), - functionHash = (targetType.FullName.GetStableHashCode() * 503) + rpcName.GetStableHashCode(), + componentIndex = (byte)GetComponentIndex(behaviorOwner, targetType), + functionHash = (ushort)RpcFullNames[$"{targetType.Name}.{rpcName}"].GetStableHashCode(), payload = writer.ToArraySegment(), }; - target.Connection.Send(msg, 0); + BufferRpcMethodInfo.Invoke(target.Connection, new object[] { msg, 0 }); - NetworkWriterPool.Recycle(writer); + NetworkWriterPool.Return(writer); } /// @@ -326,12 +429,12 @@ public static void SendFakeTargetRpc(Player target, NetworkIdentity behaviorOwne /// public static void SendFakeSyncObject(Player target, NetworkIdentity behaviorOwner, Type targetType, Action customAction) { - PooledNetworkWriter writer = NetworkWriterPool.GetWriter(); - PooledNetworkWriter writer2 = NetworkWriterPool.GetWriter(); + NetworkWriterPooled writer = NetworkWriterPool.Get(); + NetworkWriterPooled writer2 = NetworkWriterPool.Get(); MakeCustomSyncWriter(behaviorOwner, targetType, customAction, null, writer, writer2); - target.ReferenceHub.networkIdentity.connectionToClient.Send(new UpdateVarsMessage() { netId = behaviorOwner.netId, payload = writer.ToArraySegment() }); - NetworkWriterPool.Recycle(writer); - NetworkWriterPool.Recycle(writer2); + target.ReferenceHub.networkIdentity.connectionToClient.Send(new EntityStateMessage() { netId = behaviorOwner.netId, payload = writer.ToArraySegment() }); + NetworkWriterPool.Return(writer); + NetworkWriterPool.Return(writer2); } /// @@ -364,7 +467,7 @@ private static int GetComponentIndex(NetworkIdentity identity, Type type) // Make custom writer(private) private static void MakeCustomSyncWriter(NetworkIdentity behaviorOwner, Type targetType, Action customSyncObject, Action customSyncVar, NetworkWriter owner, NetworkWriter observer) { - byte behaviorDirty = 0; + ulong value = 0; NetworkBehaviour behaviour = null; // Get NetworkBehaviors index (behaviorDirty use index) @@ -373,22 +476,22 @@ private static void MakeCustomSyncWriter(NetworkIdentity behaviorOwner, Type tar if (behaviorOwner.NetworkBehaviours[i].GetType() == targetType) { behaviour = behaviorOwner.NetworkBehaviours[i]; - behaviorDirty = (byte)i; + value = 1UL << (i & 31); break; } } // Write target NetworkBehavior's dirty - owner.WriteByte(behaviorDirty); + Compression.CompressVarUInt(owner, value); // Write init position int position = owner.Position; - owner.WriteInt32(0); + owner.WriteByte(0); int position2 = owner.Position; // Write custom sync data if (customSyncObject is not null) - customSyncObject.Invoke(owner); + customSyncObject(owner); else behaviour.SerializeObjectsDelta(owner); @@ -398,15 +501,12 @@ private static void MakeCustomSyncWriter(NetworkIdentity behaviorOwner, Type tar // Write syncdata position data int position3 = owner.Position; owner.Position = position; - owner.WriteInt32(position3 - position2); + owner.WriteByte((byte)(position3 - position2 & 255)); owner.Position = position3; // Copy owner to observer if (behaviour.syncMode != SyncMode.Observers) - { - ArraySegment arraySegment = owner.ToArraySegment(); - observer.WriteBytes(arraySegment.Array, position, owner.Position - position); - } + observer.WriteBytes(owner.ToArraySegment().Array, position, owner.Position - position); } } } \ No newline at end of file diff --git a/Exiled.API/Extensions/QueueExtensions.cs b/Exiled.API/Extensions/QueueExtensions.cs new file mode 100644 index 0000000000..625a5a7787 --- /dev/null +++ b/Exiled.API/Extensions/QueueExtensions.cs @@ -0,0 +1,42 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Extensions +{ + using System; + using System.Collections.Generic; + + using Exiled.API.Features.Pools; + + /// + /// extensions. + /// + public static class QueueExtensions + { + /// + /// Removes a specific value from a queue. + /// + /// The to remove from. + /// The item to remove. + /// The of data used. + public static void RemoveFromQueue(this Queue queue, T data) + { + List toKeep = ListPool.Pool.Get(); + for (int i = 0; i < queue.Count; i++) + { + T item = queue.Dequeue(); + if (!item.Equals(data)) + toKeep.Add(item); + } + + foreach (T item2 in toKeep) + queue.Enqueue(item2); + + ListPool.Pool.Return(toKeep); + } + } +} \ No newline at end of file diff --git a/Exiled.API/Extensions/RoleExtensions.cs b/Exiled.API/Extensions/RoleExtensions.cs index dbc7599d6a..60bc7e0065 100644 --- a/Exiled.API/Extensions/RoleExtensions.cs +++ b/Exiled.API/Extensions/RoleExtensions.cs @@ -39,7 +39,7 @@ public static class RoleExtensions /// /// The to check the side of. /// . - public static Side GetSide(this RoleTypeId roleType) => GetTeam(roleType).GetSide(); + public static Side GetSide(this RoleTypeId roleType) => PlayerRolesUtils.GetTeam(roleType).GetSide(); /// /// Gets a team's . @@ -156,4 +156,4 @@ public static Dictionary GetStartingAmmo(this RoleTypeId roleT return new(); } } -} \ No newline at end of file +} diff --git a/Exiled.API/Extensions/SpawnExtensions.cs b/Exiled.API/Extensions/SpawnExtensions.cs index 8aaa362486..0c50e783fb 100644 --- a/Exiled.API/Extensions/SpawnExtensions.cs +++ b/Exiled.API/Extensions/SpawnExtensions.cs @@ -35,6 +35,7 @@ public static class SpawnExtensions SpawnLocationType.InsideGr18, SpawnLocationType.Inside914, SpawnLocationType.InsideHid, + SpawnLocationType.Inside049Armory, }; /// @@ -68,7 +69,7 @@ public static Vector3 GetPosition(this SpawnLocationType location) // The vector3.up * 1.5 is added to ensure they do not spawn inside the floor and get stuck. // The transform.forward is added to make them actually spawn INSIDE the room instead of inside the door. // ReversedLocations is a list of doors which are facing the wrong way, putting transform.forward outside the room, instead of inside, which means we need to take the negative of that offset to be where we want. - return transform.position + (Vector3.up * 1.5f) + (transform.forward * (ReversedLocations.Contains(location) ? -3f : 3f)); + return transform.position + (Vector3.up * 1.5f) + (transform.forward * (ReversedLocations.Contains(location) ? -1.5f : 3f)); } /// @@ -78,7 +79,7 @@ public static Vector3 GetPosition(this SpawnLocationType location) /// Returns the door name. public static string GetDoorName(this SpawnLocationType spawnLocation) => spawnLocation switch { - SpawnLocationType.Inside012 => "012", + SpawnLocationType.Inside330 => "330", SpawnLocationType.Inside096 => "096", SpawnLocationType.Inside914 => "914", SpawnLocationType.InsideHid => "HID", @@ -92,8 +93,7 @@ public static Vector3 GetPosition(this SpawnLocationType location) SpawnLocationType.InsideIntercom => "INTERCOM", SpawnLocationType.InsideHidRight => "HID_RIGHT", SpawnLocationType.Inside079First => "079_FIRST", - SpawnLocationType.Inside012Bottom => "012_BOTTOM", - SpawnLocationType.Inside012Locker => "012_LOCKER", + SpawnLocationType.Inside330Chamber => "330_CHAMBER", SpawnLocationType.Inside049Armory => "049_ARMORY", SpawnLocationType.Inside173Armory => "173_ARMORY", SpawnLocationType.Inside173Bottom => "173_BOTTOM", diff --git a/Exiled.API/Features/Badge.cs b/Exiled.API/Features/Badge.cs index f884dc1faa..77ef838934 100644 --- a/Exiled.API/Features/Badge.cs +++ b/Exiled.API/Features/Badge.cs @@ -9,7 +9,6 @@ namespace Exiled.API.Features { using System; using System.Collections.Generic; - using System.Linq; /// /// Represents an in-game badge. diff --git a/Exiled.API/Features/Camera.cs b/Exiled.API/Features/Camera.cs index 51bf7563b8..d72133616a 100644 --- a/Exiled.API/Features/Camera.cs +++ b/Exiled.API/Features/Camera.cs @@ -13,7 +13,7 @@ namespace Exiled.API.Features using Enums; using Exiled.API.Interfaces; - + using MapGeneration; using PlayerRoles.PlayableScps.Scp079.Cameras; using UnityEngine; @@ -23,7 +23,7 @@ namespace Exiled.API.Features /// /// The in-game Scp079Camera. /// - public class Camera : IWrapper, IPosition // Todo: Convert to IWorldSpace (Rotation Vector3 -> Quaternion) + public class Camera : IWrapper, IWorldSpace { /// /// A containing all known s and their corresponding . @@ -50,12 +50,12 @@ public class Camera : IWrapper, IPosition // Todo: Convert to IWor ["TWO-STORY OFFICE"] = CameraType.EzTwoStoryOffice, // Heavy Containment Zone - ["049 ARMORY"] = CameraType.Hcz049Armory, + ["049 OUTSIDE"] = CameraType.Hcz049Outside, ["049 CONT CHAMBER"] = CameraType.Hcz049ContChamber, - ["049 ELEV TOP"] = CameraType.Hcz049ElevTop, + ["049/173 TOP"] = CameraType.Hcz049ElevTop, ["049 HALLWAY"] = CameraType.Hcz049Hallway, - ["049 TOP FLOOR"] = CameraType.Hcz049TopFloor, - ["049 TUNNEL"] = CameraType.Hcz049Tunnel, + ["173 OUTSIDE"] = CameraType.Hcz173Outside, + ["049/173 BOTTOM"] = CameraType.Hcz049TopFloor, ["079 AIRLOCK"] = CameraType.Hcz079Airlock, ["079 CONT CHAMBER"] = CameraType.Hcz079ContChamber, ["079 HALLWAY"] = CameraType.Hcz079Hallway, @@ -72,6 +72,7 @@ public class Camera : IWrapper, IPosition // Todo: Convert to IWor ["HCZ ARMORY"] = CameraType.HczArmory, ["HCZ ARMORY INTERIOR"] = CameraType.HczArmoryInterior, ["HCZ CROSSING"] = CameraType.HczCrossing, + ["HCZ CURVE"] = CameraType.HczCurve, ["HCZ ELEV SYS A"] = CameraType.HczElevSysA, ["HCZ ELEV SYS B"] = CameraType.HczElevSysB, ["HCZ HALLWAY"] = CameraType.HczHallway, @@ -90,9 +91,7 @@ public class Camera : IWrapper, IPosition // Todo: Convert to IWor // Light Containment Zone ["173 BOTTOM"] = CameraType.Lcz173Bottom, - ["173 CONT CHAMBER"] = CameraType.Lcz173ContChamber, ["173 HALL"] = CameraType.Lcz173Hall, - ["173 STAIRS"] = CameraType.Lcz173Stairs, ["914 AIRLOCK"] = CameraType.Lcz914Airlock, ["914 CONT CHAMBER"] = CameraType.Lcz914ContChamber, ["AIRLOCK"] = CameraType.LczAirlock, @@ -137,12 +136,17 @@ internal Camera(Scp079Camera camera079) { Base = camera079; Camera079ToCamera.Add(camera079, this); + Type = GetCameraType(); +#if Debug + if (Type is CameraType.Unknown) + Log.Error($"[CAMERATYPE UNKNOWN] {this}"); +#endif } /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => Camera079ToCamera.Values; + public static IReadOnlyCollection List => Camera079ToCamera.Values; /// /// Gets a random . @@ -183,15 +187,12 @@ internal Camera(Scp079Camera camera079) /// /// Gets the camera's . /// - public ZoneType Zone => Room.Zone; + public ZoneType Zone => Room?.Zone ?? ZoneType.Unspecified; /// /// Gets the camera's . /// - public CameraType Type - { - get => NameToCameraType.ContainsKey(Name) ? NameToCameraType[Name] : CameraType.Unknown; - } + public CameraType Type { get; private set; } /// /// Gets the camera's position. @@ -201,10 +202,10 @@ public CameraType Type /// /// Gets or sets the camera's rotation. /// - public Vector3 Rotation + public Quaternion Rotation { - get => Base._cameraAnchor.rotation.eulerAngles; - set => Base._cameraAnchor.rotation = Quaternion.Euler(value); + get => Base._cameraAnchor.rotation; + set => Base._cameraAnchor.rotation = value; } /// @@ -263,10 +264,80 @@ public bool IsBeingUsed /// A of which contains elements that satify the condition. public static IEnumerable Get(Func predicate) => List.Where(predicate); + /// + /// Get a of which contains all the instance given a of . + /// + /// the of . + /// return a of , it's can be valid, or , depending if it's null or not. + /// a bool result if return sequence contain valid element. + public static bool TryGet(IEnumerable cameras, out IEnumerable result) => (result = Get(cameras)).Any(); + + /// + /// Gets the belonging to the , if any. + /// + /// The base . + /// The instance of which base. + /// if is not , or if is . + public static bool TryGet(Scp079Camera camera, out Camera result) => (result = Get(camera)) != null; + + /// + /// Gets a given the specified . + /// + /// The id camera to be shearch. + /// the result of , if is valid. + /// if is not , or if is . + public static bool TryGet(uint cameraId, out Camera result) => (result = Get(cameraId)) != null; + + /// + /// Gets a given the specified . + /// + /// The name of the camera. + /// The , if is valid. + /// if is not , or if is . + public static bool TryGet(string cameraName, out Camera result) => (result = Get(cameraName)) != null; + + /// + /// Gets a given the specified . + /// + /// The to search for. + /// The with the given . + /// if is not , or if is . + public static bool TryGet(CameraType cameraType, out Camera result) => (result = Get(cameraType)) != null; + + /// + /// Gets a of filtered based on a predicate. + /// + /// The condition to satify. + /// A of which contains elements that satify the condition. + /// if is not , or if is . + public static bool TryGet(Func predicate, out IEnumerable result) => (result = Get(predicate)).Any(); + /// /// Returns the Camera in a human-readable format. /// /// A string containing Camera-related data. - public override string ToString() => $"{Zone} ({Type}) [{Room}] *{Name}* |{Id}| ={IsBeingUsed}="; + public override string ToString() => $"({Type}) [{Room}] *{Name}* |{Id}| ={IsBeingUsed}="; + + private CameraType GetCameraType() + { + if (NameToCameraType.ContainsKey(Name)) + return NameToCameraType[Name]; + return Base.Room.Name switch + { + RoomName.Hcz049 => Name switch + { + "173 STAIRS" => CameraType.Hcz173Stairs, + "173 CONT CHAMBER" => CameraType.Hcz173ContChamber, + _ => CameraType.Unknown, + }, + RoomName.Lcz173 => Name switch + { + "173 STAIRS" => CameraType.Lcz173Stairs, + "173 CONT CHAMBER" => CameraType.Lcz173ContChamber, + _ => CameraType.Unknown, + }, + _ => CameraType.Unknown, + }; + } } } \ No newline at end of file diff --git a/Exiled.API/Features/Cassie.cs b/Exiled.API/Features/Cassie.cs index 21403089bd..bc6faa7137 100644 --- a/Exiled.API/Features/Cassie.cs +++ b/Exiled.API/Features/Cassie.cs @@ -7,6 +7,7 @@ namespace Exiled.API.Features { + using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -42,7 +43,7 @@ public static class Cassie /// /// Gets a of objects that C.A.S.S.I.E recognizes. /// - public static IReadOnlyCollection VoiceLines => Announcer.voiceLines.ToList().AsReadOnly(); + public static IReadOnlyCollection VoiceLines => Announcer.voiceLines; /// /// Reproduce a non-glitched C.A.S.S.I.E message. @@ -109,9 +110,10 @@ public static void DelayedGlitchyMessage(string message, float delay, float glit /// /// The message, which duration will be calculated. /// Determines if a number won't be converted to its full pronunciation. + /// The speed of the message. /// Duration (in seconds) of specified message. - public static float CalculateDuration(string message, bool rawNumber = false) - => Announcer.CalculateDuration(message, rawNumber); + public static float CalculateDuration(string message, bool rawNumber = false, float speed = 1f) + => Announcer.CalculateDuration(message, rawNumber, speed); /// /// Converts a into a Cassie-Readable CONTAINMENTUNIT. diff --git a/Exiled.API/Features/Components/FakeConnection.cs b/Exiled.API/Features/Components/FakeConnection.cs new file mode 100644 index 0000000000..638a28caed --- /dev/null +++ b/Exiled.API/Features/Components/FakeConnection.cs @@ -0,0 +1,33 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Components +{ + using System; + + using Mirror; + + /// + /// A fake network connection. + /// + public class FakeConnection : NetworkConnectionToClient + { + /// + public FakeConnection(int networkConnectionId) + : base(networkConnectionId) + { + } + + /// + public override string address => "localhost"; + + /// + public override void Send(ArraySegment segment, int channelId = 0) + { + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Core/TypeCastObject.cs b/Exiled.API/Features/Core/TypeCastObject.cs index 04714a0988..376ad0e86e 100644 --- a/Exiled.API/Features/Core/TypeCastObject.cs +++ b/Exiled.API/Features/Core/TypeCastObject.cs @@ -7,8 +7,6 @@ namespace Exiled.API.Features.Core { -#pragma warning disable CS0419 // Ambiguous reference in cref attribute - /// /// The interface which allows defined objects to be cast to each other. /// @@ -29,7 +27,7 @@ protected TypeCastObject() /// The type to which to cast the instance. /// The cast instance. public TObject Cast() - where TObject : class => this as T as TObject; + where TObject : class, T => this as T as TObject; /// /// Safely casts the current instance to the specified type. @@ -38,7 +36,7 @@ public TObject Cast() /// The cast object. /// if the instance was successfully cast; otherwise, . public bool Cast(out TObject param) - where TObject : class + where TObject : class, T { param = default; @@ -51,10 +49,10 @@ public bool Cast(out TObject param) /// public TObject As() - where TObject : class => Cast(); + where TObject : class, T => Cast(); /// public bool Is(out TObject param) - where TObject : class => Cast(out param); + where TObject : class, T => Cast(out param); } } \ No newline at end of file diff --git a/Exiled.API/Features/DamageHandlers/CustomDamageHandler.cs b/Exiled.API/Features/DamageHandlers/CustomDamageHandler.cs index 123297d48c..47aa8f4f13 100644 --- a/Exiled.API/Features/DamageHandlers/CustomDamageHandler.cs +++ b/Exiled.API/Features/DamageHandlers/CustomDamageHandler.cs @@ -21,6 +21,7 @@ namespace Exiled.API.Features.DamageHandlers using BaseFirearmHandler = PlayerStatsSystem.FirearmDamageHandler; using BaseHandler = PlayerStatsSystem.DamageHandlerBase; + using BaseScpDamageHandler = PlayerStatsSystem.ScpDamageHandler; /// /// A wrapper to easily manipulate the behavior of . @@ -37,7 +38,7 @@ public CustomDamageHandler(Player target, BaseHandler baseHandler) { if (Attacker is not null) { - if (Attacker.IsScp) + if (baseHandler is BaseScpDamageHandler) CustomBase = new ScpDamageHandler(target, baseHandler); else if (Attacker.CurrentItem is not null && Attacker.CurrentItem.Type.IsWeapon() && baseHandler is BaseFirearmHandler) CustomBase = new FirearmDamageHandler(Attacker.CurrentItem, target, baseHandler); @@ -118,7 +119,7 @@ public override Action ApplyDamage(Player player) AhpStat ahpModule = player.GetModule(); HealthStat healthModule = player.GetModule(); - if (Damage <= -1f) + if (Damage <= StandardDamageHandler.KillValue) return KillPlayer(player, CustomBase); ProcessDamage(player); diff --git a/Exiled.API/Features/DamageHandlers/DamageHandler.cs b/Exiled.API/Features/DamageHandlers/DamageHandler.cs index 08495b1edc..163a7c0fe9 100644 --- a/Exiled.API/Features/DamageHandlers/DamageHandler.cs +++ b/Exiled.API/Features/DamageHandlers/DamageHandler.cs @@ -37,8 +37,8 @@ public DamageHandler(Player target, Player attacker) { Target = target; Attacker = attacker; - TargetFootprint = target == null ? default : target.Footprint; - AttackerFootprint = Attacker == null ? default : Attacker.Footprint; + TargetFootprint = target?.Footprint ?? default; + AttackerFootprint = Attacker?.Footprint ?? default; } /// @@ -51,8 +51,8 @@ public DamageHandler(Player target, BaseHandler baseHandler) { Target = target; Attacker = baseHandler is PlayerStatsSystem.AttackerDamageHandler handler ? Player.Get(handler.Attacker.Hub) : null; - TargetFootprint = target == null ? default : target.Footprint; - AttackerFootprint = baseHandler is PlayerStatsSystem.AttackerDamageHandler handle ? handle.Attacker : Attacker?.Footprint ?? TargetFootprint; + TargetFootprint = target?.Footprint ?? default; + AttackerFootprint = baseHandler is PlayerStatsSystem.AttackerDamageHandler handle ? handle.Attacker : Attacker?.Footprint ?? default; } /// @@ -143,7 +143,7 @@ public override Action ApplyDamage(Player player) AhpStat ahpModule = player.GetModule(); HealthStat healthModule = player.GetModule(); - if (Damage <= -1f) + if (Damage <= StandardDamageHandler.KillValue) { ahpModule.CurValue = 0f; healthModule.CurValue = 0f; diff --git a/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs b/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs index d51bbde4ef..2a0a48d862 100644 --- a/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs +++ b/Exiled.API/Features/DamageHandlers/GenericDamageHandler.cs @@ -165,7 +165,7 @@ public GenericDamageHandler(Player player, Player attacker, float damage, Damage if (curr939 != null) curr939._lastOwner = attacker.ReferenceHub; - Base = new Scp939DamageHandler(curr939, Scp939DamageType.LungeTarget) { Damage = damage, }; + Base = new Scp939DamageHandler(curr939, damage, Scp939DamageType.LungeTarget); break; case DamageType.Scp: Base = new PlayerStatsSystem.ScpDamageHandler(attacker.ReferenceHub, damage, DeathTranslations.Unknown); diff --git a/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs b/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs index 19d1676f2e..ebeeedf616 100644 --- a/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs +++ b/Exiled.API/Features/DamageHandlers/ScpDamageHandler.cs @@ -40,8 +40,12 @@ public override DamageType Type { case Scp096DamageHandler: return DamageType.Scp096; - case Scp049DamageHandler: - return DamageType.Scp049; + case Scp049DamageHandler scp049DamageHandler: + return scp049DamageHandler.DamageSubType switch + { + Scp049DamageHandler.AttackType.Scp0492 => DamageType.Scp0492, + _ => DamageType.Scp049, + }; case BaseScpHandler scp: { DeathTranslation translation = DeathTranslations.TranslationsById[scp._translationId]; diff --git a/Exiled.API/Features/Doors/AirlockController.cs b/Exiled.API/Features/Doors/AirlockController.cs new file mode 100644 index 0000000000..62645a3926 --- /dev/null +++ b/Exiled.API/Features/Doors/AirlockController.cs @@ -0,0 +1,99 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + using System.Linq; + + using BaseController = Interactables.Interobjects.AirlockController; + + /// + /// Represents airlock. + /// + public class AirlockController + { + /// + /// A containing all known 's and their corresponding . + /// + internal static readonly Dictionary BaseToExiledControllers = new(); + + /// + /// Initializes a new instance of the class. + /// + /// Base-game controller. + public AirlockController(BaseController controller) + { + Base = controller; + + BaseToExiledControllers.Add(controller, this); + } + + /// + /// Gets the list with all airlocks. + /// + public static IReadOnlyCollection List => BaseToExiledControllers.Values; + + /// + /// Gets the basegame controller. + /// + public BaseController Base { get; } + + /// + /// Gets the first subdoor. + /// + public Door DoorA => Door.Get(Base._doorA); + + /// + /// Gets the second subdoor. + /// + public Door DoorB => Door.Get(Base._doorB); + + /// + /// Gets or sets a value indicating whether or not both subdoors are locked. + /// + public bool DoorsLocked + { + get => Base._doorsLocked; + set => Base._doorsLocked = value; + } + + /// + /// Gets or sets a value indicating whether or airlock is disabled. + /// + public bool AirlockDisabled + { + get => Base.AirlockDisabled; + set => Base.AirlockDisabled = value; + } + + /// + /// Gets the by its base-game controller. + /// + /// Base-game controller. + /// Instance of . + public static AirlockController Get(BaseController controller) => controller != null ? (BaseToExiledControllers.TryGetValue(controller, out AirlockController airlockController) ? airlockController : new AirlockController(controller)) : null; + + /// + /// Gets the by one of it's subdoors. + /// + /// Subdoor. + /// Instance of . + public static AirlockController Get(Door door) => BaseToExiledControllers.Values.FirstOrDefault(x => x.DoorA == door || x.DoorB == door); + + /// + /// Toggles airlock. + /// + public void Toggle() => Base.ToggleAirlock(); + + /// + /// Returns the Door in a human-readable format. + /// + /// A string containing Door-related data. + public override string ToString() => $"|{DoorA}| /{DoorB}/ *{DoorsLocked}* ={AirlockDisabled}="; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Doors/BasicDoor.cs b/Exiled.API/Features/Doors/BasicDoor.cs new file mode 100644 index 0000000000..cfc01cf2c6 --- /dev/null +++ b/Exiled.API/Features/Doors/BasicDoor.cs @@ -0,0 +1,60 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + + using UnityEngine; + + using Basegame = Interactables.Interobjects.BasicDoor; + + /// + /// Represents a basic interactable door. + /// + public class BasicDoor : Door + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The 's for this door. + public BasicDoor(Basegame door, List room) + : base(door, room) + { + Base = door; + } + + /// + /// Gets the base . + /// + public new Basegame Base { get; } + + /// + /// Gets the list with all SCP-106's colliders. + /// + public IEnumerable Scp106Colliders => Base.Scp106Colliders; + + /// + /// Gets or sets the total cooldown before door can be triggered again. + /// + public float Cooldown + { + get => Base._cooldownDuration; + set => Base._cooldownDuration = value; + } + + /// + /// Gets or sets the remaining cooldown before door can be triggered again. + /// + public float RemainingCooldown + { + get => Base._remainingAnimCooldown; + set => Base._remainingAnimCooldown = value; + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Doors/BasicNonInteractableDoor.cs b/Exiled.API/Features/Doors/BasicNonInteractableDoor.cs new file mode 100644 index 0000000000..477ad176ee --- /dev/null +++ b/Exiled.API/Features/Doors/BasicNonInteractableDoor.cs @@ -0,0 +1,51 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + + using Exiled.API.Interfaces; + + using Basegame = Interactables.Interobjects.BasicNonInteractableDoor; + + /// + /// Represents a basic non-interactable door. + /// + public class BasicNonInteractableDoor : BasicDoor, INonInteractableDoor + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The 's for this door. + public BasicNonInteractableDoor(Basegame door, List room) + : base(door, room) + { + Base = door; + } + + /// + /// Gets the base . + /// + public new Basegame Base { get; } + + /// + public bool IgnoreLockdowns + { + get => Base._ignoreLockdowns; + set => Base._ignoreLockdowns = value; + } + + /// + public bool IgnoreRemoteAdmin + { + get => Base._ignoreRemoteAdmin; + set => Base._ignoreRemoteAdmin = value; + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Doors/BreakableDoor.cs b/Exiled.API/Features/Doors/BreakableDoor.cs new file mode 100644 index 0000000000..a6b30617d3 --- /dev/null +++ b/Exiled.API/Features/Doors/BreakableDoor.cs @@ -0,0 +1,116 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + + using Interactables.Interobjects.DoorUtils; + + /// + /// Represents . + /// + public class BreakableDoor : BasicDoor, Interfaces.IDamageableDoor, Interfaces.INonInteractableDoor + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The 's for this door. + internal BreakableDoor(Interactables.Interobjects.BreakableDoor door, List room) + : base(door, room) + { + Base = door; + } + + /// + /// Gets the base . + /// + public new Interactables.Interobjects.BreakableDoor Base { get; } + + /// + /// Gets the prefab of broken door. + /// + public BrokenDoor BrokenDoorPrefab => Base._brokenPrefab; + + /// + /// Gets or sets max health of the door. + /// + public float MaxHealth + { + get => Base.MaxHealth; + set => Base.MaxHealth = value; + } + + /// + /// Gets or sets a value indicating whether or not door is destroyed. + /// + public bool IsDestroyed + { + get => Base.Network_destroyed; + set => Base.Network_destroyed = value; + } + + /// + /// Gets a value indicating whether or not this door is breakable. + /// + public bool IsBreakable => !IsDestroyed; + + /// + /// Gets or sets remaining health of the door. + /// + public float Health + { + get => Base.RemainingHealth; + set => Base.RemainingHealth = value; + } + + /// + /// Gets or sets damage types which will be ignored. + /// + public DoorDamageType IgnoredDamage + { + get => Base._ignoredDamageSources; + set => Base._ignoredDamageSources = value; + } + + /// + public bool IgnoreLockdowns + { + get => Base._nonInteractable; + set => Base._nonInteractable = value; + } + + /// + public bool IgnoreRemoteAdmin + { + get => Base._nonInteractable; + set => Base._nonInteractable = value; + } + + /// + /// Damages the door. + /// + /// Amount to be dealt. + /// Damage type. Some types can be ignored according to . + /// if door was damaged. Otherwise, false. + public bool Damage(float amount, DoorDamageType damageType = DoorDamageType.ServerCommand) => Base.ServerDamage(amount, damageType); + + /// + /// Breaks the specified door. No effect if the door cannot be broken, or if it is already broken. + /// + /// The to apply to the door. + /// if the door was broken, if it was unable to be broken, or was already broken before. + public bool Break(DoorDamageType type = DoorDamageType.ServerCommand) => Damage(float.MaxValue, type); + + /// + /// Returns the Door in a human-readable format. + /// + /// A string containing Door-related data. + public override string ToString() => $"{base.ToString()} |{Health}/{MaxHealth}| -{IgnoredDamage}- *{IsDestroyed}*"; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Doors/CheckpointDoor.cs b/Exiled.API/Features/Doors/CheckpointDoor.cs new file mode 100644 index 0000000000..f6cea0bc58 --- /dev/null +++ b/Exiled.API/Features/Doors/CheckpointDoor.cs @@ -0,0 +1,154 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + using System.Linq; + + using Interactables.Interobjects.DoorUtils; + + /// + /// Represents a checkpoint door. + /// + public class CheckpointDoor : Door, Interfaces.IDamageableDoor + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The for this door. + internal CheckpointDoor(Interactables.Interobjects.CheckpointDoor door, List room) + : base(door, room) + { + Base = door; + Subdoors = SubDoorsValue.AsReadOnly(); + } + + /// + /// Gets the base . + /// + public new Interactables.Interobjects.CheckpointDoor Base { get; } + + /// + /// Gets the list of all sub doors belonging to this . + /// + public IReadOnlyCollection Subdoors { get; } + + /// + /// Gets or sets the current checkpoint stage. + /// + public Interactables.Interobjects.CheckpointDoor.CheckpointSequenceStage CurrentStage + { + get => Base._currentSequence; + set => Base._currentSequence = value; + } + + /// + /// Gets or sets a time in seconds for main timer. + /// + public float MainTimer + { + get => Base._mainTimer; + set => Base._mainTimer = value; + } + + /// + /// Gets or sets time before doors close. + /// + public float WaitTime + { + get => Base._waitTime; + set => Base._waitTime = value; + } + + /// + /// Gets or sets time in seconds when warning will be shown. + /// + public float WarningTime + { + get => Base._warningTime; + set => Base._warningTime = value; + } + + /// + public bool IsDestroyed + { + get => Base.IsDestroyed; + set => Base.IsDestroyed = value; + } + + /// + public bool IsBreakable => !IsDestroyed; + + /// + public float Health + { + get => Base.GetHealthPercent(); + set + { + float health = value / Subdoors.Count; + + foreach (var door in Subdoors) + { + door.Health = health; + } + } + } + + /// + public float MaxHealth + { + get => Subdoors.Sum(door => door.MaxHealth); + set + { + float health = value / Subdoors.Count(); + + foreach (var door in Subdoors) + { + door.MaxHealth = health; + } + } + } + + /// + public DoorDamageType IgnoredDamage + { + get => Subdoors.Aggregate(DoorDamageType.None, (current, door) => current | door.IgnoredDamage); + set + { + foreach (var door in Subdoors) + { + door.IgnoredDamage = value; + } + } + } + + /// + /// Gets a containing all known subdoors s. + /// + internal List SubDoorsValue { get; } = new(); + + /// + /// Toggles the state of the doors from . + /// + /// New state for the subdoors. + public void ToggleAllDoors(bool newState) => Base.ToggleAllDoors(newState); + + /// + public bool Damage(float amount, DoorDamageType damageType = DoorDamageType.ServerCommand) => Base.ServerDamage(amount, damageType); + + /// + public bool Break(DoorDamageType type = DoorDamageType.ServerCommand) => Base.ServerDamage(float.MaxValue, type); + + /// + /// Returns the Door in a human-readable format. + /// + /// A string containing Door-related data. + public override string ToString() => $"{base.ToString()} |{WaitTime}| -{WarningTime}-"; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Door.cs b/Exiled.API/Features/Doors/Door.cs similarity index 74% rename from Exiled.API/Features/Door.cs rename to Exiled.API/Features/Doors/Door.cs index 770c81462a..a10623cf4c 100644 --- a/Exiled.API/Features/Door.cs +++ b/Exiled.API/Features/Doors/Door.cs @@ -5,33 +5,40 @@ // // ----------------------------------------------------------------------- -namespace Exiled.API.Features +namespace Exiled.API.Features.Doors { using System; using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; using System.Linq; - using Enums; + using Exiled.API.Enums; + using Exiled.API.Extensions; + using Exiled.API.Features.Core; using Exiled.API.Interfaces; - using Extensions; - using Interactables.Interobjects; using Interactables.Interobjects.DoorUtils; - using MEC; - using Mirror; using UnityEngine; using static Interactables.Interobjects.ElevatorManager; + using BaseBreakableDoor = Interactables.Interobjects.BreakableDoor; + using BaseKeycardPermissions = Interactables.Interobjects.DoorUtils.KeycardPermissions; + using Breakable = BreakableDoor; + using Checkpoint = CheckpointDoor; + using Elevator = ElevatorDoor; + using KeycardPermissions = Enums.KeycardPermissions; + /// /// A wrapper class for . /// - public class Door : IWrapper, IWorldSpace + public class Door : TypeCastObject, IWrapper, IWorldSpace { /// - /// A containing all known s and their corresponding . + /// A containing all known 's and their corresponding . /// internal static readonly Dictionary DoorVariantToDoor = new(); @@ -39,29 +46,37 @@ public class Door : IWrapper, IWorldSpace /// Initializes a new instance of the class. /// /// The base for this door. - /// The for this door. - public Door(DoorVariant door, Room room) + /// The of 's for this door. + internal Door(DoorVariant door, List rooms) { - if (room != null) + Base = door; + + if (rooms != null) + { DoorVariantToDoor.Add(door, this); + RoomsValue = rooms; + Rooms = RoomsValue.AsReadOnly(); + } - Base = door; - Room = room; Type = GetDoorType(); +#if Debug + if (Type is DoorType.Unknown) + Log.Error($"[DOORTYPE UNKNOWN] {this}"); +#endif } /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => DoorVariantToDoor.Values; + public static IReadOnlyCollection List => DoorVariantToDoor.Values; /// - /// Gets the base-game for this door. + /// Gets the base-game corresponding with this door. /// public DoorVariant Base { get; } /// - /// Gets the of the door. + /// Gets the door's . /// public GameObject GameObject => Base.gameObject; @@ -71,29 +86,34 @@ public Door(DoorVariant door, Room room) public Transform Transform => Base.transform; /// - /// Gets the of the door. + /// Gets the door's . /// public DoorType Type { get; } /// /// Gets the that the door is located in. /// - public Room Room { get; } + public Room Room => Rooms?.FirstOrDefault(); + + /// + /// Gets the 's that the door is located in. + /// + public IReadOnlyCollection Rooms { get; } /// /// Gets a value indicating whether or not the door is fully closed. /// - public bool IsFullyClosed => ExactState is 0; + public bool IsFullyClosed => Is(out Gate gate) ? !IsOpen && gate.RemainingPryCooldown <= 0 : ExactState is 0; /// /// Gets a value indicating whether the door is fully open. /// - public bool IsFullyOpen => ExactState is 1; + public bool IsFullyOpen => Is(out Gate gate) ? !IsOpen && gate.RemainingPryCooldown <= 0 : ExactState is 1; /// /// Gets a value indicating whether or not the door is currently moving. /// - public bool IsMoving => ExactState is not(0 or 1); + public bool IsMoving => Is(out Gate gate) ? !IsOpen && gate.RemainingPryCooldown > 0 : ExactState is not(0 or 1); /// /// Gets a value indicating the precise state of the door, from 0-1. A value of 0 indicates the door is fully closed, while a value of 1 indicates the door is fully open. Values in-between represent the door's animation progress. @@ -112,22 +132,52 @@ public bool IsOpen /// /// Gets a value indicating whether or not this door is a gate. /// - public bool IsGate => Base is PryableDoor; + public bool IsGate => this is Gate; /// /// Gets a value indicating whether or not this door is a checkpoint door. /// - public bool IsCheckpoint => Base is CheckpointDoor; + public bool IsCheckpoint => this is Checkpoint; /// /// Gets a value indicating whether or not this door is an elevator door. /// - public bool IsElevator => Base is ElevatorDoor; + public bool IsElevator => this is Elevator; + + /// + /// Gets a value indicating whether or not this door can be damaged. + /// + public bool IsDamageable => this is Interfaces.IDamageableDoor; + + /// + /// Gets a value indicating whether or not this door is non-interactable. + /// + public bool IsNonInteractable => this is Interfaces.INonInteractableDoor; + + /// + /// Gets a value indicating whether or not this door is subdoor belonging to a checkpoint. + /// + public bool IsPartOfCheckpoint => List.Any(x => x is Checkpoint checkpoint && checkpoint.Subdoors.Contains(this)); /// /// Gets a value indicating whether or not this door requires a keycard to open. /// - public bool IsKeycardDoor => RequiredPermissions.RequiredPermissions != Interactables.Interobjects.DoorUtils.KeycardPermissions.None; + /// + /// This value is if is equal to . + /// + public bool IsKeycardDoor => KeycardPermissions is not KeycardPermissions.None; + + /// + /// Gets or sets the keycard permissions required to open the door. + /// + /// + /// Setting this value to will allow this door to be opened without a keycard. + /// + public KeycardPermissions KeycardPermissions + { + get => (KeycardPermissions)RequiredPermissions.RequiredPermissions; + set => RequiredPermissions.RequiredPermissions = (BaseKeycardPermissions)value; + } /// /// Gets or sets the door's position. @@ -144,9 +194,17 @@ public Vector3 Position } /// - /// Gets a value indicating whether or not SCP-106 can walk through the door. + /// Gets or sets a value indicating whether or not SCP-106 can walk through the door. /// - public bool AllowsScp106 => Base is IScp106PassableDoor door && door.IsScp106Passable; + public bool AllowsScp106 + { + get => Base is IScp106PassableDoor door && door.IsScp106Passable; + set + { + if (Base is IScp106PassableDoor door) + door.IsScp106Passable = value; + } + } /// /// Gets a value indicating whether or not the door is locked. @@ -154,29 +212,13 @@ public Vector3 Position public bool IsLocked => DoorLockType > 0; /// - /// Gets or the door lock type. - /// - public DoorLockType DoorLockType => (DoorLockType)Base.NetworkActiveLocks; - - /// - /// Gets a value indicating whether or not this door is breakable. - /// - public bool IsBreakable => Base is IDamageableDoor dDoor && !dDoor.IsDestroyed; - - /// - /// Gets a value indicating whether or not this door is broken. + /// Gets or sets the door lock type. /// - public bool IsBroken => Base is IDamageableDoor dDoor && dDoor.IsDestroyed; - - /// - /// Gets a value indicating whether or not this door is ignoring lockdown. - /// - public bool IgnoresLockdowns => Base is INonInteractableDoor nonInteractableDoor && nonInteractableDoor.IgnoreLockdowns; - - /// - /// Gets a value indicating whether or not this door is ignoring remoteAdmin commands. - /// - public bool IgnoresRemoteAdmin => Base is INonInteractableDoor nonInteractableDoor && nonInteractableDoor.IgnoreRemoteAdmin; + public DoorLockType DoorLockType + { + get => (DoorLockType)Base.NetworkActiveLocks; + set => ChangeLock(value); + } /// /// Gets the door's Instance ID. @@ -202,45 +244,6 @@ public DoorPermissions RequiredPermissions set => Base.RequiredPermissions = value; } - /// - /// Gets or sets the max health of the door. No effect if the door cannot be broken. - /// - public float MaxHealth - { - get => Base is BreakableDoor breakable ? breakable._maxHealth : float.NaN; - set - { - if (Base is BreakableDoor breakable) - breakable._maxHealth = value; - } - } - - /// - /// Gets or sets the door's remaining health. No effect if the door cannot be broken. - /// - public float Health - { - get => Base is BreakableDoor breakable ? breakable.RemainingHealth : float.NaN; - set - { - if (Base is BreakableDoor breakable) - breakable.RemainingHealth = value; - } - } - - /// - /// Gets or sets the damage types this door ignores, if it is breakable. - /// - public DoorDamageType IgnoredDamageTypes - { - get => Base is BreakableDoor breakable ? breakable._ignoredDamageSources : DoorDamageType.None; - set - { - if (Base is BreakableDoor breakable) - breakable._ignoredDamageSources = value; - } - } - /// /// Gets or sets the door's rotation. /// @@ -274,6 +277,11 @@ public Vector3 Scale /// public ZoneType Zone => Room?.Zone ?? ZoneType.Unspecified; + /// + /// Gets a containing all 's that are connected with . + /// + internal List RoomsValue { get; } = new List(); + /// /// Gets the door object associated with a specific , or creates a new one if there isn't one. /// @@ -281,7 +289,16 @@ public Vector3 Scale /// A wrapper object. public static Door Get(DoorVariant doorVariant) => doorVariant != null ? (DoorVariantToDoor.TryGetValue(doorVariant, out Door door) ? door - : new Door(doorVariant, doorVariant.GetComponentInParent())) : null; + : doorVariant switch + { + Interactables.Interobjects.CheckpointDoor chkpt => new Checkpoint(chkpt, null), + BaseBreakableDoor brkbl => new Breakable(brkbl, null), + Interactables.Interobjects.ElevatorDoor elvtr => new Elevator(elvtr, null), + PryableDoor prbl => new Gate(prbl, null), + Interactables.Interobjects.BasicNonInteractableDoor nonInteractableDoor => new BasicNonInteractableDoor(nonInteractableDoor, null), + Interactables.Interobjects.BasicDoor basicDoor => new BasicDoor(basicDoor, null), + _ => new Door(doorVariant, null) + }) : null; /// /// Gets a given the specified name. @@ -337,7 +354,7 @@ public static Door GetClosest(Vector3 position, out float distance) /// object. public static Door Random(ZoneType type = ZoneType.Unspecified, bool onlyUnbroken = false) { - List doors = onlyUnbroken || type is not ZoneType.Unspecified ? Get(x => (x.Room is null || x.Room.Zone.HasFlag(type) || type == ZoneType.Unspecified) && (!x.IsBroken || !onlyUnbroken)).ToList() : DoorVariantToDoor.Values.ToList(); + List doors = onlyUnbroken || type is not ZoneType.Unspecified ? Get(x => (x.Room is null || x.Room.Zone.HasFlag(type) || type == ZoneType.Unspecified) && (x is Breakable { IsDestroyed: true } || !onlyUnbroken)).ToList() : DoorVariantToDoor.Values.ToList(); return doors[UnityEngine.Random.Range(0, doors.Count)]; } @@ -415,43 +432,6 @@ public static void UnlockAll(Func predicate) door.Unlock(); } - /// - /// Breaks the specified door. No effect if the door cannot be broken, or if it is already broken. - /// - /// The to apply to the door. - /// if the door was broken, if it was unable to be broken, or was already broken before. - public bool BreakDoor(DoorDamageType type = DoorDamageType.ServerCommand) - { - if (Base is IDamageableDoor dmg && !dmg.IsDestroyed) - { - dmg.ServerDamage(ushort.MaxValue, type); - return true; - } - - return false; - } - - /// - /// Damages the door. No effect if the door cannot be broken. - /// - /// The amount of damage to deal. - /// The damage type to use. - /// if the door was damaged. - public bool DamageDoor(float amount, DoorDamageType type = DoorDamageType.ServerCommand) => Base is BreakableDoor breakable && breakable.ServerDamage(amount, type); - - /// - /// Tries to pry the door open. No effect if the door cannot be pried. - /// - /// if the door was able to be pried open. - public bool TryPryOpen() => Base is PryableDoor pryable && pryable.TryPryGate(null); - - /// - /// Tries to pry the door open. No effect if the door cannot be pried. - /// - /// if the door was able to be pried open. - /// The amount of damage to deal. - public bool TryPryOpen(Player player) => Base is PryableDoor pryable && pryable.TryPryGate(player.ReferenceHub); - /// /// Makes the door play a beep sound. /// @@ -460,10 +440,10 @@ public void PlaySound(DoorBeepType beep) { switch (Base) { - case BasicDoor basic: - basic.RpcPlayBeepSound(beep != DoorBeepType.InteractionAllowed); + case Interactables.Interobjects.BasicDoor basic: + basic.RpcPlayBeepSound(beep is not DoorBeepType.InteractionAllowed); break; - case CheckpointDoor chkPt: + case Interactables.Interobjects.CheckpointDoor chkPt: chkPt.RpcPlayBeepSound((byte)Mathf.Min((int)beep, 3)); break; } @@ -475,7 +455,7 @@ public void PlaySound(DoorBeepType beep) /// The to use. public void ChangeLock(DoorLockType lockType) { - if (lockType == DoorLockType.None) + if (lockType is DoorLockType.None) { Base.NetworkActiveLocks = 0; } @@ -516,22 +496,37 @@ public void Lock(float time, DoorLockType lockType) /// The of the lockdown. public void Unlock(float time, DoorLockType flagsToUnlock) => DoorScheduledUnlocker.UnlockLater(Base, time, (DoorLockReason)flagsToUnlock); + /// + /// Checks if specified can interact with the door. + /// + /// Player to check. + /// if the specified player can interact with the door. Otherwise, . + public bool IsAllowToInteract(Player player = null) => Base.AllowInteracting(player?.ReferenceHub, 0); + /// /// Returns the Door in a human-readable format. /// /// A string containing Door-related data. - public override string ToString() => $"{Type} ({Zone}) [{Room}] *{DoorLockType}* |{Health}/{MaxHealth}| ={RequiredPermissions.RequiredPermissions}= -{IgnoredDamageTypes}-"; + public override string ToString() => $"{Type} ({Zone}) [{Room}] *{DoorLockType}* ={RequiredPermissions.RequiredPermissions}="; /// - /// Gets the door object associated with a specific , or creates a new one if there isn't one. + /// Creates the door object associated with a specific . /// /// The base-game . - /// The this door is in. - /// The 'room' parameter is only used if a new door wrapper needs to be created. + /// Target door . /// A wrapper object. - internal static Door Get(DoorVariant doorVariant, Room room) => DoorVariantToDoor.ContainsKey(doorVariant) - ? DoorVariantToDoor[doorVariant] - : new Door(doorVariant, room); + internal static Door Create(DoorVariant doorVariant, List rooms) => doorVariant != null ? (DoorVariantToDoor.TryGetValue(doorVariant, out Door door) + ? door + : doorVariant switch + { + Interactables.Interobjects.CheckpointDoor chkpt => new Checkpoint(chkpt, rooms), + BaseBreakableDoor brkbl => new Breakable(brkbl, rooms), + Interactables.Interobjects.ElevatorDoor elvtr => new Elevator(elvtr, rooms), + PryableDoor prbl => new Gate(prbl, rooms), + Interactables.Interobjects.BasicNonInteractableDoor nonInteractableDoor => new BasicNonInteractableDoor(nonInteractableDoor, rooms), + Interactables.Interobjects.BasicDoor basicDoor => new BasicDoor(basicDoor, rooms), + _ => new Door(doorVariant, rooms) + }) : null; private DoorType GetDoorType() { @@ -543,8 +538,8 @@ private DoorType GetDoorType() "LCZ" => Room?.Type switch { RoomType.LczCheckpointA or RoomType.LczCheckpointB or RoomType.HczEzCheckpointA - or RoomType.HczEzCheckpointB => Get(Base.GetComponentInParent())?.Type ?? DoorType.LightContainmentDoor, - RoomType.LczAirlock => (Base.GetComponentInParent() != null) ? DoorType.Airlock : DoorType.LightContainmentDoor, + or RoomType.HczEzCheckpointB => Get(Base.GetComponentInParent())?.Type ?? DoorType.LightContainmentDoor, + RoomType.LczAirlock => (Base.GetComponentInParent() != null) ? DoorType.Airlock : DoorType.LightContainmentDoor, _ => DoorType.LightContainmentDoor, }, "HCZ" => DoorType.HeavyContainmentDoor, @@ -560,10 +555,10 @@ RoomType.LczCheckpointA or RoomType.LczCheckpointB or RoomType.HczEzCheckpointA "Unsecured" => Room?.Type switch { RoomType.EzCheckpointHallway => DoorType.CheckpointGate, - RoomType.Hcz049 => DoorType.Scp049Gate, + RoomType.Hcz049 => Position.y < -805 ? DoorType.Scp049Gate : DoorType.Scp173NewGate, _ => DoorType.UnknownGate, }, - "Elevator" => (Base as ElevatorDoor)?.Group switch + "Elevator" => (Base as Interactables.Interobjects.ElevatorDoor)?.Group switch { ElevatorGroup.Nuke => DoorType.ElevatorNuke, ElevatorGroup.Scp049 => DoorType.ElevatorScp049, @@ -586,7 +581,6 @@ RoomType.LczCheckpointA or RoomType.LczCheckpointB or RoomType.HczEzCheckpointA "CHECKPOINT_EZ_HCZ_B" => DoorType.CheckpointEzHczB, "106_PRIMARY" => DoorType.Scp106Primary, "106_SECONDARY" => DoorType.Scp106Secondary, - "106_BOTTOM" => DoorType.Scp106Bottom, "ESCAPE_PRIMARY" => DoorType.EscapePrimary, "ESCAPE_SECONDARY" => DoorType.EscapeSecondary, "INTERCOM" => DoorType.Intercom, @@ -597,6 +591,7 @@ RoomType.LczCheckpointA or RoomType.LczCheckpointB or RoomType.HczEzCheckpointA "HCZ_ARMORY" => DoorType.HczArmory, "096" => DoorType.Scp096, "049_ARMORY" => DoorType.Scp049Armory, + "079_ARMORY" => DoorType.Scp079Armory, "914" => DoorType.Scp914Gate, "GATE_A" => DoorType.GateA, "079_FIRST" => DoorType.Scp079First, @@ -624,8 +619,9 @@ RoomType.LczCheckpointA or RoomType.LczCheckpointB or RoomType.HczEzCheckpointA // also gameobject names "LightContainmentDoor" => DoorType.LightContainmentDoor, "EntrDoor" => DoorType.EntranceDoor, + _ => DoorType.UnknownDoor, }; } } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Doors/ElevatorDoor.cs b/Exiled.API/Features/Doors/ElevatorDoor.cs new file mode 100644 index 0000000000..d5d303d103 --- /dev/null +++ b/Exiled.API/Features/Doors/ElevatorDoor.cs @@ -0,0 +1,73 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + using System.Linq; + + using Exiled.API.Enums; + using Interactables.Interobjects; + + /// + /// Represents an elevator door. + /// + public class ElevatorDoor : BasicDoor + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The for this door. + internal ElevatorDoor(Interactables.Interobjects.ElevatorDoor door, List room) + : base(door, room) + { + Base = door; + Lift = Lift.Get(x => x.Group == Group).FirstOrDefault(); + } + + /// + /// Gets the base . + /// + public new Interactables.Interobjects.ElevatorDoor Base { get; } + + /// + /// Gets the that this door's belongs to. + /// + public ElevatorManager.ElevatorGroup Group => Base.Group; + + /// + /// Gets the type according to . + /// + public ElevatorType ElevatorType => Group switch + { + ElevatorManager.ElevatorGroup.Scp049 => ElevatorType.Scp049, + ElevatorManager.ElevatorGroup.GateA => ElevatorType.GateA, + ElevatorManager.ElevatorGroup.GateB => ElevatorType.GateB, + ElevatorManager.ElevatorGroup.LczA01 or ElevatorManager.ElevatorGroup.LczA02 => ElevatorType.LczA, + ElevatorManager.ElevatorGroup.LczB01 or ElevatorManager.ElevatorGroup.LczB02 => ElevatorType.LczB, + ElevatorManager.ElevatorGroup.Nuke => ElevatorType.Nuke, + _ => ElevatorType.Unknown, + }; + + /// + /// Gets the target panel for this lift. + /// + public ElevatorPanel Panel => Base.TargetPanel; + + /// + /// Gets the associated with this elevator door. + /// + public Lift Lift { get; } + + /// + /// Returns the Door in a human-readable format. + /// + /// A string containing Door-related data. + public override string ToString() => $"{base.ToString()} !{ElevatorType}!"; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Doors/Gate.cs b/Exiled.API/Features/Doors/Gate.cs new file mode 100644 index 0000000000..b9f6f943f7 --- /dev/null +++ b/Exiled.API/Features/Doors/Gate.cs @@ -0,0 +1,74 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Doors +{ + using System.Collections.Generic; + + using Exiled.API.Enums; + using Interactables.Interobjects; + using Interactables.Interobjects.DoorUtils; + using UnityEngine; + + /// + /// Represents a "pryable" door or gate. + /// + public class Gate : BasicDoor + { + /// + /// Initializes a new instance of the class. + /// + /// The base for this door. + /// The 's for this door. + public Gate(PryableDoor door, List room) + : base(door, room) + { + Base = door; + } + + /// + /// Gets the base . + /// + public new PryableDoor Base { get; } + + /// + /// Gets the list of all available pry positions. + /// + public IEnumerable PryPositions => Base.PryPositions; + + /// + /// Gets or sets remaining cooldown for prying. + /// + public float RemainingPryCooldown + { + get => Base._remainingPryCooldown; + set => Base._remainingPryCooldown = value; + } + + /// + /// Gets or sets which will block prying if door has them. + /// + public DoorLockType BlockingPryingMask + { + get => (DoorLockType)Base._blockPryingMask; + set => Base._blockPryingMask = (DoorLockReason)value; + } + + /// + /// Tries to pry the door open. No effect if the door cannot be pried. + /// + /// if the door was able to be pried open. + /// to perform pry gate. + public bool TryPry(Player player = null) => Base.TryPryGate(player?.ReferenceHub); + + /// + /// Returns the Door in a human-readable format. + /// + /// A string containing Door-related data. + public override string ToString() => $"{base.ToString()} |{BlockingPryingMask}| -{RemainingPryCooldown}-"; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Generator.cs b/Exiled.API/Features/Generator.cs index 0817220276..ca855c2384 100644 --- a/Exiled.API/Features/Generator.cs +++ b/Exiled.API/Features/Generator.cs @@ -42,7 +42,7 @@ internal Generator(Scp079Generator scp079Generator) /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => Scp079GeneratorToGenerator.Values; + public static IReadOnlyCollection List => Scp079GeneratorToGenerator.Values; /// /// Gets the base . @@ -224,10 +224,8 @@ public KeycardPermissions KeycardPermissions /// /// The instance. /// A or if not found. - public static Generator Get(Scp079Generator scp079Generator) => - Scp079GeneratorToGenerator.TryGetValue(scp079Generator, out Generator generator) ? - generator : - new(scp079Generator); + public static Generator Get(Scp079Generator scp079Generator) => scp079Generator == null ? null : + Scp079GeneratorToGenerator.TryGetValue(scp079Generator, out Generator generator) ? generator : new(scp079Generator); /// /// Gets a of given the specified . diff --git a/Exiled.API/Features/GlobalPatchProcessor.cs b/Exiled.API/Features/GlobalPatchProcessor.cs index f1a1606159..dee1ceda16 100644 --- a/Exiled.API/Features/GlobalPatchProcessor.cs +++ b/Exiled.API/Features/GlobalPatchProcessor.cs @@ -34,6 +34,32 @@ public class GlobalPatchProcessor /// public static IReadOnlyDictionary> PatchedGroupMethods => PatchedGroupMethodsValue; + /// + /// Patch all your Harmony and return you the number of failed patch. + /// + /// The Harmony instance to Patch. + /// The number of failed patch. + public static void PatchAll(Harmony harmony, out int failedPatch) + { + failedPatch = 0; + foreach (Type type in AccessTools.GetTypesFromAssembly(Assembly.GetCallingAssembly())) + { + try + { + harmony.CreateClassProcessor(type).Patch(); + } + catch (HarmonyException exception) + { + Log.Error($"Patching by attributes failed!\n{exception}"); + + failedPatch++; + continue; + } + } + + Log.Debug("Events patched by attributes successfully!"); + } + /// /// Searches the current assembly for Harmony annotations and uses them to create patches. ///
It supports target-patching using and the relative .
@@ -161,4 +187,4 @@ public static void UnpatchAll(string id = "", string groupId = null) } } } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Hazards/AmnesticCloudHazard.cs b/Exiled.API/Features/Hazards/AmnesticCloudHazard.cs new file mode 100644 index 0000000000..c385c143fb --- /dev/null +++ b/Exiled.API/Features/Hazards/AmnesticCloudHazard.cs @@ -0,0 +1,96 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Hazards +{ + using PlayerRoles.PlayableScps.Scp939; + + /// + /// A wrapper for SCP-939's amnestic cloud. + /// + public class AmnesticCloudHazard : TemporaryHazard + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + public AmnesticCloudHazard(Scp939AmnesticCloudInstance hazard) + : base(hazard) + { + Base = hazard; + Ability = Base._cloud; + Owner = Player.Get(Ability.Owner); + } + + /// + public new Scp939AmnesticCloudInstance Base { get; } + + /// + /// Gets the for this instance. + /// + public Scp939AmnesticCloudAbility Ability { get; } + + /// + /// Gets the player who controls SCP-939. + /// + public Player Owner { get; } + + /// + /// Gets or sets current state of cloud. + /// + public Scp939AmnesticCloudInstance.CloudState State + { + get => Base.State; + set => Base.State = value; + } + + /// + /// Gets or sets duration for effects. + /// + public float EffectDuration + { + get => Base._amnesiaDuration; + set => Base._amnesiaDuration = value; + } + + /// + /// Gets or sets minimum time to press key to spawn cloud. + /// + public float MinHoldTime + { + get => Base._minHoldTime; + set => Base._minHoldTime = value; + } + + /// + /// Gets or sets maximum time to press key to spawn cloud. + /// + public float MaxHoldTime + { + get => Base._maxHoldTime; + set => Base._maxHoldTime = value; + } + + /// + /// Gets or sets total duration before hazard will get destroyed. + /// + public new float TotalDuration + { + get => Base._targetDuration; + set => Base._targetDuration = value; + } + + /// + /// Gets or sets a value indicating whether or not hazard is active or not. + /// + public bool TargetState + { + get => Ability.TargetState; + set => Ability.TargetState = value; + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Hazards/Hazard.cs b/Exiled.API/Features/Hazards/Hazard.cs new file mode 100644 index 0000000000..eabd6dc930 --- /dev/null +++ b/Exiled.API/Features/Hazards/Hazard.cs @@ -0,0 +1,152 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Hazards +{ + using System; + using System.Collections.Generic; + using System.Linq; + + using Exiled.API.Features.Core; + using Exiled.API.Interfaces; + using global::Hazards; + using PlayerRoles.PlayableScps.Scp939; + using UnityEngine; + + /// + /// A wrapper for . + /// + public class Hazard : TypeCastObject, IWrapper + { + /// + /// with to it's . + /// + internal static readonly Dictionary EnvironmentalHazardToHazard = new(); + + /// + /// Initializes a new instance of the class. + /// + /// The instance. + public Hazard(EnvironmentalHazard hazard) + { + Base = hazard; + + EnvironmentalHazardToHazard.Add(hazard, this); + } + + /// + /// Gets the list of all hazards. + /// + public static IReadOnlyCollection List => EnvironmentalHazardToHazard.Values; + + /// + /// Gets the . + /// + public EnvironmentalHazard Base { get; } + + /// + /// Gets or sets the list with all affected by this hazard players. + /// + public IEnumerable AffectedPlayers + { + get => Base.AffectedPlayers.Select(Player.Get); + set + { + Base.AffectedPlayers.Clear(); + Base.AffectedPlayers.AddRange(value.Select(x => x.ReferenceHub)); + } + } + + /// + /// Gets or sets max hazard distance. + /// + public float MaxDistance + { + get => Base.MaxDistance; + set => Base.MaxDistance = value; + } + + /// + /// Gets or sets max hazard height. + /// + public float MaxHeightDistance + { + get => Base.MaxHeightDistance; + set => Base.MaxHeightDistance = value; + } + + /// + /// Gets a value indicating whether or not hazard is active. + /// + public bool IsActive => Base.IsActive; + + /// + /// Gets or sets offset for position. + /// + public Vector3 PositionOffset + { + get => Base.SourceOffset; + set => Base.SourceOffset = value; + } + + /// + /// Gets the room where this hazard is located. + /// + public Room Room => Room.FindParentRoom(Base.gameObject); + + /// + /// Gets or sets the position. + /// + public Vector3 Position + { + get => Base.SourcePosition; + set => Base.SourcePosition = value; + } + + /// + /// Gets the by . + /// + /// The instance. + /// for . + public static Hazard Get(EnvironmentalHazard hazard) => hazard switch + { + TantrumEnvironmentalHazard tantrumEnvironmentalHazard => new TantrumHazard(tantrumEnvironmentalHazard), + Scp939AmnesticCloudInstance scp939AmnesticCloudInstance => new AmnesticCloudHazard(scp939AmnesticCloudInstance), + SinkholeEnvironmentalHazard sinkholeEnvironmentalHazard => new SinkholeHazard(sinkholeEnvironmentalHazard), + global::Hazards.TemporaryHazard temporaryHazard => new TemporaryHazard(temporaryHazard), + _ => new Hazard(hazard) + }; + + /// + /// Gets the hazard by the room where it's located. + /// + /// Room. + /// in given . + public static Hazard Get(Room room) => Get(x => x.Room == room).FirstOrDefault(); + + /// + /// Gets the hazard by it's . + /// + /// Game object. + /// in given . + public static Hazard Get(GameObject obj) => Get(x => x.Base.gameObject == obj).FirstOrDefault(); + + /// + /// Gets the of based on predicate. + /// + /// Condition to satisfy. + /// of based on predicate. + public static IEnumerable Get(Func predicate) => List.Where(predicate); + + /// + /// Checks if player is in hazard zone. + /// + /// Player to check. + /// if player is in hazard zone. Otherwise, false. + public bool IsInArea(Player player) => Base.IsInArea(Position, player.Position); + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Hazards/SinkholeHazard.cs b/Exiled.API/Features/Hazards/SinkholeHazard.cs new file mode 100644 index 0000000000..e8e0c4f3a1 --- /dev/null +++ b/Exiled.API/Features/Hazards/SinkholeHazard.cs @@ -0,0 +1,32 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Hazards +{ + using global::Hazards; + + /// + /// Represents a sinkhole hazard. + /// + public class SinkholeHazard : Hazard + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + public SinkholeHazard(SinkholeEnvironmentalHazard hazard) + : base(hazard) + { + Base = hazard; + } + + /// + /// Gets the . + /// + public new SinkholeEnvironmentalHazard Base { get; } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Hazards/TantrumHazard.cs b/Exiled.API/Features/Hazards/TantrumHazard.cs new file mode 100644 index 0000000000..55bf7a6d15 --- /dev/null +++ b/Exiled.API/Features/Hazards/TantrumHazard.cs @@ -0,0 +1,64 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Hazards +{ + using System.Collections.Generic; + using System.Linq; + + using global::Hazards; + using RelativePositioning; + using UnityEngine; + + /// + /// A wrapper for . + /// + public class TantrumHazard : TemporaryHazard + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + public TantrumHazard(TantrumEnvironmentalHazard hazard) + : base(hazard) + { + Base = hazard; + } + + /// + /// Gets the . + /// + public new TantrumEnvironmentalHazard Base { get; } + + /// + /// Gets or sets a value indicating whether or not sizzle should be played. + /// + public bool PlaySizzle + { + get => Base.PlaySizzle; + set => Base.PlaySizzle = value; + } + + /// + /// Gets or sets the synced position. + /// + public RelativePosition SynchronisedPosition + { + get => Base.SynchronizedPosition; + set => Base.SynchronizedPosition = value; + } + + /// + /// Gets or sets the correct position of tantrum hazard. + /// + public Transform CorrectPosition + { + get => Base._correctPosition; + set => Base._correctPosition = value; + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Hazards/TemporaryHazard.cs b/Exiled.API/Features/Hazards/TemporaryHazard.cs new file mode 100644 index 0000000000..a75008364d --- /dev/null +++ b/Exiled.API/Features/Hazards/TemporaryHazard.cs @@ -0,0 +1,71 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Hazards +{ + using System.Collections.Generic; + using System.Linq; + + using BaseHazard = global::Hazards.TemporaryHazard; + + /// + /// Represents temporary hazard. + /// + public class TemporaryHazard : Hazard + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + public TemporaryHazard(BaseHazard hazard) + : base(hazard) + { + Base = hazard; + } + + /// + /// Gets the . + /// + public new BaseHazard Base { get; } + + /// + /// Gets or sets a value indicating whether or not hazard is destroyed. + /// + public bool IsDestroyed + { + get => Base._destroyed; + set + { + if (!value) + { + Duration = 0; + } + + Base._destroyed = value; + } + } + + /// + /// Gets the total duration before hazard gets destroyed. + /// + public float TotalDuration => Base.HazardDuration; + + /// + /// Gets or sets elapsed time which has spend after creating. + /// + public float Duration + { + get => Base._elapsed; + set => Base._elapsed = value; + } + + /// + /// Destroys this hazard. + /// + public void Destroy() => Base.ServerDestroy(); + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Intercom.cs b/Exiled.API/Features/Intercom.cs index adf527c4cf..585eb3081f 100644 --- a/Exiled.API/Features/Intercom.cs +++ b/Exiled.API/Features/Intercom.cs @@ -91,15 +91,11 @@ public static float SpeechRemainingTime /// /// Reset the intercom's cooldown. /// - public static void Reset() => RemainingCooldown = -1f; + public static void Reset() => State = IntercomState.Ready; /// /// Times out the intercom. /// - public static void Timeout() - { - if (InUse) - SpeechRemainingTime = -1f; - } + public static void Timeout() => State = IntercomState.Cooldown; } } \ No newline at end of file diff --git a/Exiled.API/Features/Items/Ammo.cs b/Exiled.API/Features/Items/Ammo.cs index 4a03f6aed0..4c88a7f846 100644 --- a/Exiled.API/Features/Items/Ammo.cs +++ b/Exiled.API/Features/Items/Ammo.cs @@ -10,7 +10,6 @@ namespace Exiled.API.Features.Items using Enums; using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Firearms.Ammo; /// diff --git a/Exiled.API/Features/Items/Armor.cs b/Exiled.API/Features/Items/Armor.cs index c69933cc23..170f0602be 100644 --- a/Exiled.API/Features/Items/Armor.cs +++ b/Exiled.API/Features/Items/Armor.cs @@ -13,12 +13,12 @@ namespace Exiled.API.Features.Items using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Armor; using PlayerRoles; using Structs; + using UnityEngine; /// /// A wrapper class for . @@ -85,32 +85,36 @@ public bool RemoveExcessOnDrop /// /// Gets or sets how strong the helmet on the armor is. /// - /// When trying to set the value below 0 or above 100. public int HelmetEfficacy { get => Base.HelmetEfficacy; set { - if (value is <= 101 and >= 0) - Base.HelmetEfficacy = value; - else - throw new ArgumentOutOfRangeException(nameof(HelmetEfficacy), "Value of armor efficacy must be between 0 and 100."); + if (value is > 100 or < 0) + { + Log.Warn($"{nameof(HelmetEfficacy)} Value of armor efficacy must be between 0 and 100."); + value = Mathf.Clamp(value, 0, 100); + } + + Base.HelmetEfficacy = value; } } /// /// Gets or sets how strong the vest on the armor is. /// - /// When trying to set the value below 0 or above 100. public int VestEfficacy { get => Base.VestEfficacy; set { - if (value is <= 101 and >= 0) - Base.VestEfficacy = value; - else - throw new ArgumentOutOfRangeException(nameof(VestEfficacy), "Value of armor efficacy must be between 0 and 100."); + if (value is > 100 or < 0) + { + Log.Warn($"{nameof(VestEfficacy)} Value of armor efficacy must be between 0 and 100."); + value = Mathf.Clamp(value, 0, 100); + } + + Base.VestEfficacy = value; } } diff --git a/Exiled.API/Features/Items/Consumable.cs b/Exiled.API/Features/Items/Consumable.cs index 9519019571..55851c04b4 100644 --- a/Exiled.API/Features/Items/Consumable.cs +++ b/Exiled.API/Features/Items/Consumable.cs @@ -9,8 +9,6 @@ namespace Exiled.API.Features.Items { using Exiled.API.Interfaces; - using InventorySystem.Items; - using BaseConsumable = InventorySystem.Items.Usables.Consumable; /// diff --git a/Exiled.API/Features/Items/ExplosiveGrenade.cs b/Exiled.API/Features/Items/ExplosiveGrenade.cs index 6eb7adfbad..0a93ea93f0 100644 --- a/Exiled.API/Features/Items/ExplosiveGrenade.cs +++ b/Exiled.API/Features/Items/ExplosiveGrenade.cs @@ -11,7 +11,6 @@ namespace Exiled.API.Features.Items using Exiled.API.Features.Pickups; using Exiled.API.Features.Pickups.Projectiles; - using Exiled.API.Interfaces; using InventorySystem.Items; using InventorySystem.Items.Pickups; @@ -119,7 +118,7 @@ public ExplosionGrenadeProjectile SpawnActive(Vector3 position, Player owner = n #endif ItemPickupBase ipb = Object.Instantiate(Projectile.Base, position, Quaternion.identity); - ipb.Info = new PickupSyncInfo(Type, position, Quaternion.identity, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new PickupSyncInfo(Type, Weight, ItemSerialGenerator.GenerateNext()); ExplosionGrenadeProjectile grenade = (ExplosionGrenadeProjectile)Pickup.Get(ipb); diff --git a/Exiled.API/Features/Items/Firearm.cs b/Exiled.API/Features/Items/Firearm.cs index 868afaeb06..60ea62df4c 100644 --- a/Exiled.API/Features/Items/Firearm.cs +++ b/Exiled.API/Features/Items/Firearm.cs @@ -570,7 +570,7 @@ public override Pickup CreatePickup(Vector3 position, Quaternion rotation = defa { ItemPickupBase ipb = Object.Instantiate(Base.PickupDropModel, position, rotation); - ipb.Info = new(Type, position, rotation, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); ipb.gameObject.transform.localScale = Scale; FirearmPickup pickup = Pickup.Get(ipb).As(); @@ -619,7 +619,7 @@ internal override void ChangeOwner(Player oldOwner, Player newOwner) AutomaticFirearm automaticFirearm => new SingleBulletHitreg(automaticFirearm, automaticFirearm.Owner, automaticFirearm._recoilPattern), Shotgun shotgun => - new BuckshotHitreg(shotgun, shotgun.Owner, shotgun._buckshotStats), + new BuckshotHitreg(shotgun, shotgun.Owner, shotgun.GetBuckshotPattern), ParticleDisruptor particleDisruptor => new DisruptorHitreg(particleDisruptor, particleDisruptor.Owner, particleDisruptor._explosionSettings), Revolver revolver => diff --git a/Exiled.API/Features/Items/FlashGrenade.cs b/Exiled.API/Features/Items/FlashGrenade.cs index 67794aa71b..9638c9eade 100644 --- a/Exiled.API/Features/Items/FlashGrenade.cs +++ b/Exiled.API/Features/Items/FlashGrenade.cs @@ -10,7 +10,6 @@ namespace Exiled.API.Features.Items using Exiled.API.Enums; using Exiled.API.Features.Pickups; using Exiled.API.Features.Pickups.Projectiles; - using Exiled.API.Interfaces; using InventorySystem.Items; using InventorySystem.Items.Pickups; @@ -99,7 +98,7 @@ public FlashbangProjectile SpawnActive(Vector3 position, Player owner = null) #endif ItemPickupBase ipb = Object.Instantiate(Projectile.Base, position, Quaternion.identity); - ipb.Info = new PickupSyncInfo(Type, position, Quaternion.identity, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new PickupSyncInfo(Type, Weight, ItemSerialGenerator.GenerateNext()); FlashbangProjectile grenade = (FlashbangProjectile)Pickup.Get(ipb); diff --git a/Exiled.API/Features/Items/Flashlight.cs b/Exiled.API/Features/Items/Flashlight.cs index 5ee9b766a5..6b95414d24 100644 --- a/Exiled.API/Features/Items/Flashlight.cs +++ b/Exiled.API/Features/Items/Flashlight.cs @@ -9,7 +9,6 @@ namespace Exiled.API.Features.Items { using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Flashlight; using Utils.Networking; diff --git a/Exiled.API/Features/Items/Item.cs b/Exiled.API/Features/Items/Item.cs index 35c644ce88..4f847af765 100644 --- a/Exiled.API/Features/Items/Item.cs +++ b/Exiled.API/Features/Items/Item.cs @@ -86,12 +86,7 @@ internal Item(ItemType type) /// public ushort Serial { - get - { - if (Base.ItemSerial is 0) - return Serial = ItemSerialGenerator.GenerateNext(); - return Base.ItemSerial; - } + get => Base.ItemSerial; set => Base.ItemSerial = value; } @@ -177,7 +172,7 @@ public ushort Serial /// The item wrapper for the given . public static Item Get(ItemBase itemBase) { - if (itemBase is null) + if (itemBase == null) return null; if (BaseToItem.TryGetValue(itemBase, out Item item)) @@ -206,6 +201,7 @@ public static Item Get(ItemBase itemBase) FlashbangGrenade => new FlashGrenade(throwable), ExplosionGrenade => new ExplosiveGrenade(throwable), Scp2176Projectile => new Scp2176(throwable), + Scp018Projectile => new Scp018(throwable), _ => new Throwable(throwable), }, _ => new Item(itemBase), @@ -259,10 +255,11 @@ public static Item Get(ItemBase itemBase) ItemType.Radio => new Radio(), ItemType.MicroHID => new MicroHid(), ItemType.GrenadeFlash => new FlashGrenade(owner), - ItemType.GrenadeHE or ItemType.SCP018 => new ExplosiveGrenade(type, owner), - ItemType.GunCrossvec or ItemType.GunLogicer or ItemType.GunRevolver or ItemType.GunShotgun or ItemType.GunAK or ItemType.GunCOM15 or ItemType.GunCOM18 or ItemType.GunCom45 or ItemType.GunE11SR or ItemType.GunFSP9 or ItemType.ParticleDisruptor => new Firearm(type), - ItemType.KeycardGuard or ItemType.KeycardJanitor or ItemType.KeycardO5 or ItemType.KeycardScientist or ItemType.KeycardChaosInsurgency or ItemType.KeycardContainmentEngineer or ItemType.KeycardFacilityManager or ItemType.KeycardResearchCoordinator or ItemType.KeycardZoneManager or ItemType.KeycardNTFCommander or ItemType.KeycardNTFLieutenant or - ItemType.KeycardNTFOfficer => new Keycard(type), + ItemType.GrenadeHE => new ExplosiveGrenade(type, owner), + ItemType.SCP018 => new Scp018(type, owner), + ItemType.GunCrossvec or ItemType.GunLogicer or ItemType.GunRevolver or ItemType.GunShotgun or ItemType.GunAK or ItemType.GunCOM15 or ItemType.GunCOM18 or ItemType.GunCom45 or ItemType.GunE11SR or ItemType.GunFSP9 or ItemType.ParticleDisruptor or ItemType.GunA7 or ItemType.GunFRMG0 => new Firearm(type), + ItemType.KeycardGuard or ItemType.KeycardJanitor or ItemType.KeycardO5 or ItemType.KeycardScientist or ItemType.KeycardChaosInsurgency or ItemType.KeycardContainmentEngineer or ItemType.KeycardFacilityManager or ItemType.KeycardResearchCoordinator or ItemType.KeycardZoneManager or ItemType.KeycardMTFPrivate or ItemType.KeycardMTFOperative or + ItemType.KeycardMTFCaptain => new Keycard(type), ItemType.ArmorLight or ItemType.ArmorCombat or ItemType.ArmorHeavy => new Armor(type), ItemType.SCP330 => new Scp330(), ItemType.SCP2176 => new Scp2176(owner), @@ -293,7 +290,7 @@ public virtual Pickup CreatePickup(Vector3 position, Quaternion rotation = defau { ItemPickupBase ipb = Object.Instantiate(Base.PickupDropModel, position, rotation); - ipb.Info = new(Type, position, rotation, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); ipb.gameObject.transform.localScale = Scale; Pickup pickup = Pickup.Get(ipb); diff --git a/Exiled.API/Features/Items/Jailbird.cs b/Exiled.API/Features/Items/Jailbird.cs index 8467fd4fd3..71fdba57e7 100644 --- a/Exiled.API/Features/Items/Jailbird.cs +++ b/Exiled.API/Features/Items/Jailbird.cs @@ -10,33 +10,12 @@ namespace Exiled.API.Features.Items using Exiled.API.Interfaces; using InventorySystem.Items.Jailbird; - using UnityEngine; /// /// A wrapped class for . /// public class Jailbird : Item, IWrapper { - /// - /// Number of Charges use before the weapon become AlmostDepleted. - /// - public const int ChargesWarning = JailbirdItem.ChargesWarning; - - /// - /// Number of Charges use before the weapon will being destroy. - /// - public const int ChargesLimit = JailbirdItem.ChargesLimit; - - /// - /// Number of Damage made before the weapon become AlmostDepleted. - /// - public const float DamageWarning = JailbirdItem.DamageWarning; - - /// - /// Number of Damage made before the weapon will being destroy. - /// - public const float DamageLimit = JailbirdItem.DamageLimit; - /// /// Initializes a new instance of the class. /// @@ -99,28 +78,15 @@ public float Radius /// /// Gets or sets the total amount of damage dealt with the Jailbird. /// - /// public float TotalDamageDealt { get => Base._hitreg.TotalMeleeDamageDealt; set => Base._hitreg.TotalMeleeDamageDealt = value; } - /// - /// Gets or sets the amount of damage remaining before the Jailbird breaks. - /// - /// Modifying this value will directly modify . - /// - public float RemainingDamage - { - get => Mathf.Clamp(DamageLimit - TotalDamageDealt, int.MinValue, int.MaxValue); - set => TotalDamageDealt = Mathf.Clamp(DamageLimit - value, float.MinValue, float.MaxValue); - } - /// /// Gets or sets the number of times the item has been charged and used. /// - /// public int TotalCharges { get => Base.TotalChargesPerformed; @@ -128,39 +94,23 @@ public int TotalCharges } /// - /// Gets a value indicating whether the weapon warn the player than the Item will be broken. - /// - public bool IsAlmostDepleted => IsDamageWarning || IsChargesWarning; - - /// - /// Gets a value indicating whether . - /// - public bool IsDamageWarning => TotalDamageDealt >= DamageWarning; - - /// - /// Gets a value indicating whether . + /// Gets or sets the for this item. /// - public bool IsChargesWarning => TotalCharges >= ChargesWarning; - - /// - /// Gets or sets the amount of charges remaining before the Jailbird breaks. - /// - /// Modifying this value will directly modify . - /// - public int RemainingCharges + public JailbirdWearState WearState { - get => Mathf.Clamp(ChargesLimit - TotalCharges, int.MinValue, int.MaxValue); - set => TotalCharges = Mathf.Clamp(ChargesLimit - value, int.MinValue, int.MaxValue); + get => Base._deterioration.WearState; + set + { + if (JailbirdDeteriorationTracker.ReceivedStates.ContainsKey(Serial)) + JailbirdDeteriorationTracker.ReceivedStates[Serial] = value; + Base._deterioration.RecheckUsage(); + } } /// /// Breaks the Jailbird. /// - public void Break() - { - Base._broken = true; - Base.SendRpc(JailbirdMessageType.Broken); - } + public void Break() => WearState = JailbirdWearState.Broken; /// /// Clones current object. diff --git a/Exiled.API/Features/Items/Keycard.cs b/Exiled.API/Features/Items/Keycard.cs index f53a43a8cc..98a4328918 100644 --- a/Exiled.API/Features/Items/Keycard.cs +++ b/Exiled.API/Features/Items/Keycard.cs @@ -10,7 +10,6 @@ namespace Exiled.API.Features.Items using Exiled.API.Enums; using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Keycards; /// diff --git a/Exiled.API/Features/Items/MicroHid.cs b/Exiled.API/Features/Items/MicroHid.cs index dd56b4d54b..2527707de6 100644 --- a/Exiled.API/Features/Items/MicroHid.cs +++ b/Exiled.API/Features/Items/MicroHid.cs @@ -9,7 +9,6 @@ namespace Exiled.API.Features.Items { using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.MicroHID; /// diff --git a/Exiled.API/Features/Items/Radio.cs b/Exiled.API/Features/Items/Radio.cs index 5bf4f90515..3207e085ff 100644 --- a/Exiled.API/Features/Items/Radio.cs +++ b/Exiled.API/Features/Items/Radio.cs @@ -10,7 +10,6 @@ namespace Exiled.API.Features.Items using Enums; using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Radio; using Structs; diff --git a/Exiled.API/Features/Items/Scp018.cs b/Exiled.API/Features/Items/Scp018.cs new file mode 100644 index 0000000000..f560933878 --- /dev/null +++ b/Exiled.API/Features/Items/Scp018.cs @@ -0,0 +1,125 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Items +{ + using Enums; + + using Exiled.API.Features.Pickups; + using Exiled.API.Features.Pickups.Projectiles; + + using InventorySystem.Items; + using InventorySystem.Items.Pickups; + using InventorySystem.Items.ThrowableProjectiles; + + using UnityEngine; + + using BaseScp018Projectile = InventorySystem.Items.ThrowableProjectiles.Scp018Projectile; + + using Object = UnityEngine.Object; + + using Scp018Projectile = Pickups.Projectiles.Scp018Projectile; + + /// + /// A wrapper class for item. + /// + public class Scp018 : Throwable + { + /// + /// Initializes a new instance of the class. + /// + /// The base class. + public Scp018(ThrowableItem itemBase) + : base(itemBase) + { + Projectile = (Scp018Projectile)((Throwable)this).Projectile; + } + + /// + /// Initializes a new instance of the class. + /// + /// The of the grenade. + /// The owner of the grenade. Leave for no owner. + /// The player parameter will always need to be defined if this grenade is custom using Exiled.CustomItems. + internal Scp018(ItemType type, Player player = null) + : this((ThrowableItem)(player ?? Server.Host).Inventory.CreateItemInstance(new(type, 0), true)) + { + } + + /// + /// Gets a to change grenade properties. + /// + public new Scp018Projectile Projectile { get; } + + /// + /// Gets or sets the time for SCP-018 not to ignore the friendly fire. + /// + public float FriendlyFireTime + { + get => Projectile.FriendlyFireTime; + set => Projectile.FriendlyFireTime = value; + } + + /// + /// Gets or sets how long the fuse will last. + /// + public float FuseTime + { + get => Projectile.FuseTime; + set => Projectile.FuseTime = value; + } + + /// + /// Spawns an active grenade on the map at the specified location. + /// + /// The location to spawn the grenade. + /// Optional: The owner of the grenade. + /// Spawned grenade. + public Scp018Projectile SpawnActive(Vector3 position, Player owner = null) + { +#if DEBUG + Log.Debug($"Spawning active grenade: {FuseTime}"); +#endif + ItemPickupBase ipb = Object.Instantiate(Projectile.Base, position, Quaternion.identity); + + ipb.Info = new PickupSyncInfo(Type, Weight, ItemSerialGenerator.GenerateNext()); + + Scp018Projectile grenade = (Scp018Projectile)Pickup.Get(ipb); + + grenade.Base.gameObject.SetActive(true); + + grenade.FriendlyFireTime = FriendlyFireTime; + grenade.FuseTime = FuseTime; + + grenade.PreviousOwner = owner ?? Server.Host; + + grenade.Spawn(); + + grenade.Base.ServerActivate(); + + return grenade; + } + + /// + /// Returns the ExplosiveGrenade in a human readable format. + /// + /// A string containing ExplosiveGrenade-related data. + public override string ToString() => $"{Type} ({Serial}) [{Weight}] *{Scale}* |{FuseTime}|"; + + /// + /// Clones current object. + /// + /// New object. + public override Item Clone() => new Scp018(Type) + { + FriendlyFireTime = FriendlyFireTime, + FuseTime = FuseTime, + PinPullTime = PinPullTime, + Repickable = Repickable, + }; + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Items/Scp1576.cs b/Exiled.API/Features/Items/Scp1576.cs index e155face16..571eeae1e9 100644 --- a/Exiled.API/Features/Items/Scp1576.cs +++ b/Exiled.API/Features/Items/Scp1576.cs @@ -9,7 +9,6 @@ namespace Exiled.API.Features.Items { using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Usables; using InventorySystem.Items.Usables.Scp1576; diff --git a/Exiled.API/Features/Items/Scp2176.cs b/Exiled.API/Features/Items/Scp2176.cs index 1f05a04e75..4a4b50a8b9 100644 --- a/Exiled.API/Features/Items/Scp2176.cs +++ b/Exiled.API/Features/Items/Scp2176.cs @@ -8,7 +8,6 @@ namespace Exiled.API.Features.Items { using Exiled.API.Features.Pickups; - using Exiled.API.Interfaces; using InventorySystem.Items; using InventorySystem.Items.Pickups; @@ -70,7 +69,7 @@ public Scp2176Projectile SpawnActive(Vector3 position, Player owner = null) #endif ItemPickupBase ipb = Object.Instantiate(Projectile.Base, position, Quaternion.identity); - ipb.Info = new PickupSyncInfo(Type, position, Quaternion.identity, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new PickupSyncInfo(Type, Weight, ItemSerialGenerator.GenerateNext()); Scp2176Projectile grenade = (Scp2176Projectile)Pickup.Get(ipb); diff --git a/Exiled.API/Features/Items/Scp244.cs b/Exiled.API/Features/Items/Scp244.cs index ac0d341009..1aa6598353 100644 --- a/Exiled.API/Features/Items/Scp244.cs +++ b/Exiled.API/Features/Items/Scp244.cs @@ -10,7 +10,6 @@ namespace Exiled.API.Features.Items using Exiled.API.Features.Pickups; using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.Usables.Scp244; using UnityEngine; @@ -64,7 +63,7 @@ public override Pickup CreatePickup(Vector3 position, Quaternion rotation = defa { Scp244Pickup pickup = (Scp244Pickup)Pickup.Get(Object.Instantiate(Base.PickupDropModel, position, rotation)); - pickup.Info = new(Type, position, rotation, pickup.Weight, Serial); + pickup.Info = new(Type, pickup.Weight, Serial); pickup.State = Base._primed ? Scp244State.Active : Scp244State.Idle; pickup.Scale = Scale; diff --git a/Exiled.API/Features/Items/Scp330.cs b/Exiled.API/Features/Items/Scp330.cs index d26da6f348..888981f253 100644 --- a/Exiled.API/Features/Items/Scp330.cs +++ b/Exiled.API/Features/Items/Scp330.cs @@ -188,7 +188,7 @@ public IEnumerable DropCandy(CandyKindID type, bool dropAll = fals { ItemPickupBase ipb = Object.Instantiate(Base.PickupDropModel, Owner.Position, default); - ipb.Info = new(Type, Owner.Position, default, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); Scp330Pickup pickup = (Scp330Pickup)Pickup.Get(ipb); @@ -197,7 +197,7 @@ public IEnumerable DropCandy(CandyKindID type, bool dropAll = fals for (int i = 0; i < count; i++) pickup.Candies.Add(type); - pickup.Base.InfoReceived(default, pickup.Info); + pickup.Base.InfoReceivedHook(default, pickup.Info); pickup.Scale = Scale; pickup.Spawn(); pickups.Add(pickup); @@ -209,7 +209,7 @@ public IEnumerable DropCandy(CandyKindID type, bool dropAll = fals { ItemPickupBase ipb = Object.Instantiate(Base.PickupDropModel, Owner.Position, default); - ipb.Info = new(Type, Owner.Position, default, Weight, ItemSerialGenerator.GenerateNext()); + ipb.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); Scp330Pickup pickup = (Scp330Pickup)Pickup.Get(ipb); @@ -217,7 +217,7 @@ public IEnumerable DropCandy(CandyKindID type, bool dropAll = fals pickup.ExposedCandy = exposedType; pickup.Candies.Add(type); - pickup.Base.InfoReceived(default, pickup.Info); + pickup.Base.InfoReceivedHook(default, pickup.Info); pickup.Scale = Scale; pickup.Spawn(); pickups.Add(pickup); @@ -237,7 +237,7 @@ public override Pickup CreatePickup(Vector3 position, Quaternion rotation = defa { Scp330Pickup pickup = (Scp330Pickup)Pickup.Get(Object.Instantiate(Base.PickupDropModel, position, rotation)); - pickup.Info = new(Type, Owner.Position, rotation, Weight, ItemSerialGenerator.GenerateNext()); + pickup.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); pickup.Candies = new(Base.Candies); pickup.ExposedCandy = ExposedType; pickup.Scale = Scale; diff --git a/Exiled.API/Features/Items/Throwable.cs b/Exiled.API/Features/Items/Throwable.cs index 8ded6a9538..8e7e24a581 100644 --- a/Exiled.API/Features/Items/Throwable.cs +++ b/Exiled.API/Features/Items/Throwable.cs @@ -11,7 +11,6 @@ namespace Exiled.API.Features.Items using Exiled.API.Features.Pickups.Projectiles; using Exiled.API.Interfaces; - using InventorySystem.Items; using InventorySystem.Items.ThrowableProjectiles; using UnityEngine; @@ -30,7 +29,7 @@ public Throwable(ThrowableItem itemBase) { Base = itemBase; Base.Projectile.gameObject.SetActive(false); - Projectile = Pickup.Get(Object.Instantiate(Base.Projectile)) as Projectile; + Projectile = (Projectile)Pickup.Get(Object.Instantiate(Base.Projectile)); Base.Projectile.gameObject.SetActive(true); Projectile.Serial = Serial; } diff --git a/Exiled.API/Features/Items/Usable.cs b/Exiled.API/Features/Items/Usable.cs index f18489140b..406cedb9dc 100644 --- a/Exiled.API/Features/Items/Usable.cs +++ b/Exiled.API/Features/Items/Usable.cs @@ -91,7 +91,7 @@ public float MaxCancellableTime /// public float RemainingCooldown { - get => UsableItemsController.GlobalItemCooldowns[Serial]; + get => UsableItemsController.GlobalItemCooldowns.TryGetValue(Serial, out float value) ? value : -1; set => UsableItemsController.GlobalItemCooldowns[Serial] = Time.timeSinceLevelLoad + value; } @@ -111,7 +111,7 @@ public override Pickup CreatePickup(Vector3 position, Quaternion rotation = defa { Pickup pickup = Pickup.Get(Object.Instantiate(Base.PickupDropModel, position, rotation)); - pickup.Info = new(Type, position, rotation, Weight, ItemSerialGenerator.GenerateNext()); + pickup.Info = new(Type, Weight, ItemSerialGenerator.GenerateNext()); pickup.Scale = Scale; if (spawn) diff --git a/Exiled.API/Features/Lift.cs b/Exiled.API/Features/Lift.cs index 9f3548c039..af9cc27a64 100644 --- a/Exiled.API/Features/Lift.cs +++ b/Exiled.API/Features/Lift.cs @@ -12,17 +12,18 @@ namespace Exiled.API.Features using System.Linq; using Exiled.API.Enums; + using Exiled.API.Features.Doors; using Exiled.API.Features.Pools; using Exiled.API.Interfaces; - using Interactables.Interobjects; using Interactables.Interobjects.DoorUtils; - using UnityEngine; using static Interactables.Interobjects.ElevatorChamber; using static Interactables.Interobjects.ElevatorManager; + using Elevator = Interactables.Interobjects.ElevatorDoor; + /// /// The in-game lift. /// @@ -36,7 +37,7 @@ public class Lift : IWrapper, IWorldSpace /// /// Internal list that contains all ElevatorDoor for current group. /// - private readonly List internalDoorsList = ListPool.Pool.Get(); + private readonly List internalDoorsList = ListPool.Pool.Get(); /// /// Initializes a new instance of the class. @@ -47,19 +48,18 @@ internal Lift(ElevatorChamber elevator) Base = elevator; ElevatorChamberToLift.Add(elevator, this); - foreach (ElevatorDoor door in ElevatorDoor.AllElevatorDoors.First(elevator => elevator.Key == Group).Value) - internalDoorsList.Add(door); + internalDoorsList.AddRange(Interactables.Interobjects.ElevatorDoor.AllElevatorDoors[Group]); } /// /// Finalizes an instance of the class. /// - ~Lift() => ListPool.Pool.Return(internalDoorsList); + ~Lift() => ListPool.Pool.Return(internalDoorsList); /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => ElevatorChamberToLift.Values; + public static IReadOnlyCollection List => ElevatorChamberToLift.Values; /// /// Gets a random . @@ -75,7 +75,12 @@ internal Lift(ElevatorChamber elevator) /// /// Gets a value of the internal doors list. /// - public IReadOnlyCollection Doors => internalDoorsList; + public IReadOnlyCollection Doors => internalDoorsList.Select(x => Door.Get(x).As()).ToList(); + + /// + /// Gets a of in the . + /// + public IEnumerable Players => Player.List.Where(x => Bounds.Contains(x.Position)); /// /// Gets the lift's name. @@ -175,7 +180,7 @@ public float AnimationTime /// /// Gets the . /// - public ElevatorDoor CurrentDestination => Base.CurrentDestination; + public Doors.ElevatorDoor CurrentDestination => Door.Get(Base.CurrentDestination).As(); /// /// Gets a of which contains all the instances from the specified . @@ -258,23 +263,23 @@ public void ChangeLock(DoorLockReason lockReason) { bool forceLock = lockReason != DoorLockReason.None; - foreach (ElevatorDoor door in Doors) + foreach (Doors.ElevatorDoor door in Doors) { if (!forceLock) { - door.NetworkActiveLocks = 0; + door.DoorLockType = 0; - door.ServerChangeLock(DoorLockReason.None, true); + door.ChangeLock(DoorLockType.None); } else { - door.ServerChangeLock(lockReason, true); + door.ChangeLock((DoorLockType)lockReason); if (CurrentLevel != 1) TrySetDestination(Group, 1, true); } - Base.RefreshLocks(Group, door); + Base.RefreshLocks(Group, door.Base); } } @@ -291,4 +296,4 @@ public void ChangeLock(DoorLockReason lockReason) /// A string containing Lift-related data. public override string ToString() => $"{Type} {Status} [{CurrentLevel}] *{IsLocked}*"; } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Log.cs b/Exiled.API/Features/Log.cs index f2ab16e5fc..c81099e29b 100644 --- a/Exiled.API/Features/Log.cs +++ b/Exiled.API/Features/Log.cs @@ -9,20 +9,17 @@ namespace Exiled.API.Features { using System; using System.Collections.Generic; - using System.Linq; using System.Reflection; - using Interfaces; - /// /// A set of tools to print messages on the server console. /// public static class Log { /// - /// Keep in memory the value of the Debug config. + /// Gets a of plugin assemblies that have debug logs enabled. /// - internal static readonly Dictionary KnownDebugValues = new(); + public static HashSet DebugEnabled { get; } = new(); /// /// Sends a level messages to the game console. @@ -41,7 +38,21 @@ public static class Log /// Server must have exiled_debug config enabled. /// /// The message to be sent. - public static void Debug(object message) => Debug(message.ToString()); + public static void Debug(object message) + { + Assembly callingAssembly = Assembly.GetCallingAssembly(); + +#if DEBUG + if (callingAssembly.GetName().Name is "Exiled.API") + { + Send($"[{callingAssembly.GetName().Name}] {message}", Discord.LogLevel.Debug, ConsoleColor.Green); + return; + } +#endif + + if (DebugEnabled.Contains(callingAssembly)) + Send($"[{callingAssembly.GetName().Name}] {message}", Discord.LogLevel.Debug, ConsoleColor.Green); + } /// /// Sends a level messages to the game console. @@ -72,15 +83,8 @@ public static void Debug(string message) return; } #endif - if (!KnownDebugValues.ContainsKey(callingAssembly)) - { - if (!Server.PluginAssemblies.ContainsKey(callingAssembly)) - SetDebugThroughReflection(callingAssembly); - else - KnownDebugValues.Add(callingAssembly, Server.PluginAssemblies[callingAssembly].Config.Debug); - } - if (KnownDebugValues[callingAssembly]) + if (DebugEnabled.Contains(callingAssembly)) Send($"[{callingAssembly.GetName().Name}] {message}", Discord.LogLevel.Debug, ConsoleColor.Green); } @@ -170,19 +174,5 @@ public static void Assert(bool condition, object message) throw new Exception(message.ToString()); } - - private static void SetDebugThroughReflection(Assembly assembly) - { - try - { - IPlugin eventsPlugin = Server.PluginAssemblies.Values.FirstOrDefault(p => p.Name == "Exiled.Events"); - KnownDebugValues.Add(assembly, eventsPlugin?.Config.Debug ?? false); - } - catch (Exception e) - { - Error(e); - KnownDebugValues.Add(assembly, false); - } - } } } \ No newline at end of file diff --git a/Exiled.API/Features/Map.cs b/Exiled.API/Features/Map.cs index cae081e59e..59c3003815 100644 --- a/Exiled.API/Features/Map.cs +++ b/Exiled.API/Features/Map.cs @@ -12,34 +12,29 @@ namespace Exiled.API.Features using System.Collections.ObjectModel; using System.Linq; + using Decals; using Enums; - using Exiled.API.Extensions; + using Exiled.API.Features.Doors; + using Exiled.API.Features.Hazards; using Exiled.API.Features.Pickups; - using Exiled.API.Features.Roles; using Exiled.API.Features.Toys; - - using Hazards; - + using global::Hazards; + using InventorySystem; using InventorySystem.Items.Firearms.BasicMessages; - + using InventorySystem.Items.Pickups; + using InventorySystem.Items.ThrowableProjectiles; using Items; - using LightContainmentZoneDecontamination; - using MapGeneration; using MapGeneration.Distributors; - using Mirror; - using PlayerRoles; using PlayerRoles.PlayableScps.Scp173; using PlayerRoles.PlayableScps.Scp939; - using RelativePositioning; - using UnityEngine; - + using Utils; using Utils.Networking; using Object = UnityEngine.Object; @@ -55,7 +50,7 @@ public static class Map /// /// A list of s on the map. /// - internal static readonly List LockersValue = new(250); + internal static readonly List LockersValue = new(35); /// /// A list of s on the map. @@ -67,13 +62,11 @@ public static class Map /// internal static readonly List ToysValue = new(); - private static readonly ReadOnlyCollection ReadOnlyTeleportsValue = TeleportsValue.AsReadOnly(); - private static readonly ReadOnlyCollection ReadOnlyLockersValue = LockersValue.AsReadOnly(); - private static readonly ReadOnlyCollection ReadOnlyToysValue = ToysValue.AsReadOnly(); - private static TantrumEnvironmentalHazard tantrumPrefab; private static Scp939AmnesticCloudInstance amnesticCloudPrefab; + private static AmbientSoundPlayer ambientSoundPlayer; + /// /// Gets the tantrum prefab. /// @@ -83,7 +76,7 @@ public static TantrumEnvironmentalHazard TantrumPrefab { if (tantrumPrefab == null) { - Scp173GameRole scp173Role = RoleTypeId.Scp173.GetRoleBase() as Scp173GameRole; + Scp173GameRole scp173Role = (Scp173GameRole)RoleTypeId.Scp173.GetRoleBase(); if (scp173Role.SubroutineModule.TryGetSubroutine(out Scp173TantrumAbility scp173TantrumAbility)) tantrumPrefab = scp173TantrumAbility._tantrumPrefab; @@ -102,7 +95,7 @@ public static Scp939AmnesticCloudInstance AmnesticCloudPrefab { if (amnesticCloudPrefab == null) { - Scp939GameRole scp939Role = RoleTypeId.Scp939.GetRoleBase() as Scp939GameRole; + Scp939GameRole scp939Role = (Scp939GameRole)RoleTypeId.Scp939.GetRoleBase(); if (scp939Role.SubroutineModule.TryGetSubroutine(out Scp939AmnesticCloudAbility ability)) amnesticCloudPrefab = ability._instancePrefab; @@ -115,22 +108,22 @@ public static Scp939AmnesticCloudInstance AmnesticCloudPrefab /// /// Gets a value indicating whether decontamination has begun in the light containment zone. /// - public static bool IsLczDecontaminated => DecontaminationController.Singleton._stopUpdating; // && !DecontaminationController.Singleton.disableDecontamination; + public static bool IsLczDecontaminated => DecontaminationController.Singleton.IsDecontaminating; /// /// Gets all objects. /// - public static ReadOnlyCollection PocketDimensionTeleports => ReadOnlyTeleportsValue; + public static ReadOnlyCollection PocketDimensionTeleports { get; } = TeleportsValue.AsReadOnly(); /// /// Gets all objects. /// - public static ReadOnlyCollection Lockers => ReadOnlyLockersValue; + public static ReadOnlyCollection Lockers { get; } = LockersValue.AsReadOnly(); /// /// Gets all objects. /// - public static ReadOnlyCollection Toys => ReadOnlyToysValue; + public static ReadOnlyCollection Toys { get; } = ToysValue.AsReadOnly(); /// /// Gets or sets the current seed of the map. @@ -148,16 +141,7 @@ public static int Seed /// /// Gets the . /// - public static AmbientSoundPlayer AmbientSoundPlayer { get; internal set; } - - /// - /// Tries to find the room that a is inside, first using the 's parents, then using a Raycast if no room was found. - /// - /// The inside the room. - /// The that the is located inside. Can be . - /// - [Obsolete("Use Room.FindParentRoom(GameObject) instead.")] - public static Room FindParentRoom(GameObject objectInRoom) => Room.FindParentRoom(objectInRoom); + public static AmbientSoundPlayer AmbientSoundPlayer => ambientSoundPlayer != null ? ambientSoundPlayer : (ambientSoundPlayer = ReferenceHub.HostHub.GetComponent()); /// /// Broadcasts a message to all players. @@ -204,11 +188,7 @@ public static void ShowHint(string message, float duration = 3f) /// /// Starts the light containment zone decontamination process. /// - public static void StartDecontamination() - { - DecontaminationController.Singleton.FinishDecontamination(); - DecontaminationController.Singleton.NetworkRoundStartTime = -1f; - } + public static void StartDecontamination() => DecontaminationController.Singleton.ForceDecontamination(); /// /// Turns off all lights in the facility. @@ -217,13 +197,13 @@ public static void StartDecontamination() /// The s to affect. public static void TurnOffAllLights(float duration, ZoneType zoneTypes = ZoneType.Unspecified) { - foreach (FlickerableLightController controller in FlickerableLightController.Instances) + foreach (RoomLightController controller in RoomLightController.Instances) { Room room = controller.GetComponentInParent(); - if (room is null) + if (room == null) continue; - if (zoneTypes == ZoneType.Unspecified || (room is not null && (zoneTypes == room.Zone))) + if (zoneTypes == ZoneType.Unspecified || room.Zone.HasFlag(zoneTypes)) controller.ServerFlickerLights(duration); } } @@ -279,8 +259,8 @@ public static void PlayAmbientSound(int id) /// The position where you want to spawn the Tantrum. /// Whether or not the tantrum will apply the effect. /// If is , the tantrum is moved slightly up from its original position. Otherwise, the collision will not be detected and the slowness will not work. - /// The tantrum's . - public static GameObject PlaceTantrum(Vector3 position, bool isActive = true) + /// The instance. + public static TantrumHazard PlaceTantrum(Vector3 position, bool isActive = true) { TantrumEnvironmentalHazard tantrum = Object.Instantiate(TantrumPrefab); @@ -293,7 +273,45 @@ public static GameObject PlaceTantrum(Vector3 position, bool isActive = true) NetworkServer.Spawn(tantrum.gameObject); - return tantrum.gameObject; + return Hazard.Get(tantrum).Cast(); + } + + /// + /// Destroy all objects. + /// + public static void CleanAllItems() + { + foreach (Pickup pickup in Pickup.List.ToList()) + pickup.Destroy(); + } + + /// + /// Destroy all the objects from the specified list. + /// + /// The List of pickups to destroy. + public static void CleanAllItems(IEnumerable pickups) + { + foreach (Pickup pickup in pickups) + pickup.Destroy(); + } + + /// + /// Destroy all objects. + /// + public static void CleanAllRagdolls() + { + foreach (Ragdoll ragDoll in Ragdoll.List.ToList()) + ragDoll.Destroy(); + } + + /// + /// Destroy all objects from the specified list. + /// + /// The List of RagDolls to destroy. + public static void CleanAllRagdolls(IEnumerable ragDolls) + { + foreach (Ragdoll ragDoll in ragDolls) + ragDoll.Destroy(); } /// @@ -301,7 +319,7 @@ public static GameObject PlaceTantrum(Vector3 position, bool isActive = true) /// /// The position of the blood decal. /// The direction of the blood decal. - public static void PlaceBlood(Vector3 position, Vector3 direction) => new GunHitMessage(position, direction, true).SendToAuthenticated(0); + public static void PlaceBlood(Vector3 position, Vector3 direction) => new GunDecalMessage(position, direction, DecalPoolType.Blood).SendToAuthenticated(0); /// /// Gets all the near cameras. @@ -312,26 +330,53 @@ public static GameObject PlaceTantrum(Vector3 position, bool isActive = true) public static IEnumerable GetNearCameras(Vector3 position, float toleration = 15f) => Camera.Get(cam => (position - cam.Position).sqrMagnitude <= toleration * toleration); + /// + /// Explode. + /// + /// The position where explosion will be created. + /// The projectile that will create the explosion. + /// The player who create the explosion. + public static void Explode(Vector3 position, ProjectileType projectileType, Player attacker = null) + { + ItemType item; + if ((item = projectileType.GetItemType()) is ItemType.None) + return; + attacker ??= Server.Host; + if (!InventoryItemLoader.TryGetItem(item, out ThrowableItem throwableItem)) + return; + ExplosionUtils.ServerSpawnEffect(position, item); + + if (throwableItem.Projectile is ExplosionGrenade explosionGrenade) + ExplosionGrenade.Explode(attacker.Footprint, position, explosionGrenade); + } + + /// + /// Spawn projectile effect. + /// + /// The position where effect will be created. + /// The projectile that will create the effect. + public static void ExplodeEffect(Vector3 position, ProjectileType projectileType) + { + ItemType item; + if ((item = projectileType.GetItemType()) is ItemType.None) + return; + ExplosionUtils.ServerSpawnEffect(position, item); + } + /// /// Clears the lazy loading game object cache. /// internal static void ClearCache() { - Room.RoomIdentifierToRoom.Clear(); - Door.DoorVariantToDoor.Clear(); - Lift.ElevatorChamberToLift.Clear(); - Camera.Camera079ToCamera.Clear(); - Window.BreakableWindowToWindow.Clear(); - TeslaGate.BaseTeslaGateToTeslaGate.Clear(); - Pickup.BaseToPickup.Clear(); Item.BaseToItem.Clear(); - TeleportsValue.Clear(); - LockersValue.Clear(); + + LockersValue.RemoveAll(locker => locker == null); + Ragdoll.BasicRagdollToRagdoll.Clear(); + Firearm.ItemTypeToFirearmInstance.Clear(); Firearm.BaseCodesValue.Clear(); Firearm.AvailableAttachmentsValue.Clear(); - Warhead.InternalBlastDoors.Clear(); } } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Npc.cs b/Exiled.API/Features/Npc.cs new file mode 100644 index 0000000000..8a57379d04 --- /dev/null +++ b/Exiled.API/Features/Npc.cs @@ -0,0 +1,212 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +#nullable enable +namespace Exiled.API.Features +{ + using System; + using System.Collections.Generic; + + using CommandSystem; + + using Exiled.API.Enums; + using Exiled.API.Extensions; + using Exiled.API.Features.Components; + + using Footprinting; + + using MEC; + + using Mirror; + + using PlayerRoles; + + using UnityEngine; + + using Object = UnityEngine.Object; + + /// + /// Wrapper class for handling NPC players. + /// + public class Npc : Player + { + /// + public Npc(ReferenceHub referenceHub) + : base(referenceHub) + { + } + + /// + public Npc(GameObject gameObject) + : base(gameObject) + { + } + + /// + /// Gets a list of Npcs. + /// + public new List List + { + get + { + List npcS = new(); + foreach (Player player in Player.List) + { + if (player is Npc npc) + npcS.Add(npc); + } + + return npcS; + } + } + + /// + /// Retrieves the NPC associated with the specified ReferenceHub. + /// + /// The ReferenceHub to retrieve the NPC for. + /// The NPC associated with the ReferenceHub, or null if not found. + public static new Npc? Get(ReferenceHub rHub) => Player.Get(rHub) as Npc; + + /// + /// Retrieves the NPC associated with the specified GameObject. + /// + /// The GameObject to retrieve the NPC for. + /// The NPC associated with the GameObject, or null if not found. + public static new Npc? Get(GameObject gameObject) => Player.Get(gameObject) as Npc; + + /// + /// Retrieves the NPC associated with the specified user ID. + /// + /// The user ID to retrieve the NPC for. + /// The NPC associated with the user ID, or null if not found. + public static new Npc? Get(string userId) => Player.Get(userId) as Npc; + + /// + /// Retrieves the NPC associated with the specified ID. + /// + /// The ID to retrieve the NPC for. + /// The NPC associated with the ID, or null if not found. + public static new Npc? Get(int id) => Player.Get(id) as Npc; + + /// + /// Retrieves the NPC associated with the specified ICommandSender. + /// + /// The ICommandSender to retrieve the NPC for. + /// The NPC associated with the ICommandSender, or null if not found. + public static new Npc? Get(ICommandSender sender) => Player.Get(sender) as Npc; + + /// + /// Retrieves the NPC associated with the specified Footprint. + /// + /// The Footprint to retrieve the NPC for. + /// The NPC associated with the Footprint, or null if not found. + public static new Npc? Get(Footprint footprint) => Player.Get(footprint) as Npc; + + /// + /// Retrieves the NPC associated with the specified CommandSender. + /// + /// The CommandSender to retrieve the NPC for. + /// The NPC associated with the CommandSender, or null if not found. + public static new Npc? Get(CommandSender sender) => Player.Get(sender) as Npc; + + /// + /// Retrieves the NPC associated with the specified Collider. + /// + /// The Collider to retrieve the NPC for. + /// The NPC associated with the Collider, or null if not found. + public static new Npc? Get(Collider collider) => Player.Get(collider) as Npc; + + /// + /// Retrieves the NPC associated with the specified net ID. + /// + /// The net ID to retrieve the NPC for. + /// The NPC associated with the net ID, or null if not found. + public static new Npc? Get(uint netId) => Player.Get(netId) as Npc; + + /// + /// Retrieves the NPC associated with the specified NetworkConnection. + /// + /// The NetworkConnection to retrieve the NPC for. + /// The NPC associated with the NetworkConnection, or null if not found. + public static new Npc? Get(NetworkConnection conn) => Player.Get(conn) as Npc; + + /// + /// Spawns an NPC based on the given parameters. + /// + /// The name of the NPC. + /// The RoleTypeId of the NPC. + /// The player ID of the NPC. + /// The userID of the NPC. + /// The position to spawn the NPC. + /// The spawned. + public static Npc Spawn(string name, RoleTypeId role, int id = 0, string userId = "", Vector3? position = null) + { + GameObject newObject = Object.Instantiate(NetworkManager.singleton.playerPrefab); + Npc npc = new(newObject) + { + IsVerified = true, + IsNPC = true, + }; + try + { + npc.ReferenceHub.roleManager.InitializeNewRole(RoleTypeId.None, RoleChangeReason.None); + } + catch (Exception e) + { + Log.Debug($"Ignore: {e}"); + } + + if (RecyclablePlayerId.FreeIds.Contains(id)) + { + RecyclablePlayerId.FreeIds.RemoveFromQueue(id); + } + else if (RecyclablePlayerId._autoIncrement >= id) + { + RecyclablePlayerId._autoIncrement = id = RecyclablePlayerId._autoIncrement + 1; + } + + FakeConnection fakeConnection = new(id); + NetworkServer.AddPlayerForConnection(fakeConnection, newObject); + try + { + npc.ReferenceHub.characterClassManager.UserId = string.IsNullOrEmpty(userId) ? $"Dummy@localhost" : userId; + } + catch (Exception e) + { + Log.Debug($"Ignore: {e}"); + } + + npc.ReferenceHub.nicknameSync.Network_myNickSync = name; + Dictionary.Add(newObject, npc); + + Timing.CallDelayed( + 0.3f, + () => + { + npc.Role.Set(role, SpawnReason.RoundStart, position is null ? RoleSpawnFlags.All : RoleSpawnFlags.AssignInventory); + }); + + if (position is not null) + Timing.CallDelayed(0.5f, () => npc.Position = position.Value); + return npc; + } + + /// + /// Destroys the NPC. + /// + public void Destroy() + { + NetworkConnectionToClient conn = ReferenceHub.connectionToClient; + if (ReferenceHub._playerId.Value <= RecyclablePlayerId._autoIncrement) + ReferenceHub._playerId.Destroy(); + ReferenceHub.OnDestroy(); + CustomNetworkManager.TypedSingleton.OnServerDisconnect(conn); + Dictionary.Remove(GameObject); + Object.Destroy(GameObject); + } + } +} diff --git a/Exiled.API/Features/Paths.cs b/Exiled.API/Features/Paths.cs index 6cbb6926fe..e27f452136 100644 --- a/Exiled.API/Features/Paths.cs +++ b/Exiled.API/Features/Paths.cs @@ -9,6 +9,7 @@ namespace Exiled.API.Features { using System; using System.IO; + using System.Linq; /// /// A set of useful paths. @@ -105,7 +106,7 @@ public static void Reload(string rootDirectory = null) Dependencies = Path.Combine(Plugins, "dependencies"); Configs = Path.Combine(Exiled, "Configs"); IndividualConfigs = Path.Combine(Configs, "Plugins"); - LoaderConfig = Path.Combine(Configs, "loader.yml"); + LoaderConfig = PluginAPI.Loader.AssemblyLoader.InstalledPlugins.FirstOrDefault(x => x.PluginName == "Exiled Loader")?.MainConfigPath; Config = Path.Combine(Configs, $"{Server.Port}-config.yml"); BackupConfig = Path.Combine(Configs, $"{Server.Port}-config.yml.old"); IndividualTranslations = Path.Combine(Configs, "Translations"); diff --git a/Exiled.API/Features/Pickups/BodyArmorPickup.cs b/Exiled.API/Features/Pickups/BodyArmorPickup.cs index 4c660df082..c1ee3111ad 100644 --- a/Exiled.API/Features/Pickups/BodyArmorPickup.cs +++ b/Exiled.API/Features/Pickups/BodyArmorPickup.cs @@ -7,7 +7,17 @@ namespace Exiled.API.Features.Pickups { + using System; + using System.Collections.Generic; + using System.Linq; + + using Exiled.API.Features.Items; using Exiled.API.Interfaces; + using Exiled.API.Structs; + using InventorySystem.Items; + using InventorySystem.Items.Armor; + using PlayerRoles; + using UnityEngine; using BaseBodyArmor = InventorySystem.Items.Armor.BodyArmorPickup; @@ -16,6 +26,9 @@ namespace Exiled.API.Features.Pickups /// public class BodyArmorPickup : Pickup, IWrapper { + private int helmetEfficacy; + private int vestEfficacy; + /// /// Initializes a new instance of the class. /// @@ -41,10 +54,124 @@ internal BodyArmorPickup(ItemType type) /// public new BaseBodyArmor Base { get; } + /// + /// Gets a value indicating whether this item is equippable. + /// + public bool Equippable { get; } = false; + + /// + /// Gets a value indicating whether this item is holsterable. + /// + public bool Holsterable { get; } = false; + + /// + /// Gets a value indicating whether or not this is a worn item. + /// + public bool IsWorn { get; } = true; + + /// + /// Gets or sets a value indicating whether or not excess ammo should be removed when the armor is dropped. + /// + public bool RemoveExcessOnDrop { get; set; } + + /// + /// Gets or sets how strong the helmet on the armor is. + /// + public int HelmetEfficacy + { + get => helmetEfficacy; + set + { + if (value is > 100 or < 0) + { + Log.Warn($"{nameof(HelmetEfficacy)} Value of armor efficacy must be between 0 and 100."); + value = Mathf.Clamp(value, 0, 100); + } + + helmetEfficacy = value; + } + } + + /// + /// Gets or sets how strong the vest on the armor is. + /// + public int VestEfficacy + { + get => vestEfficacy; + set + { + if (value is > 101 or < 0) + { + Log.Warn($"{nameof(VestEfficacy)} Value of armor efficacy must be between 0 and 100."); + value = Mathf.Clamp(value, 0, 100); + } + + vestEfficacy = value; + } + } + + /// + /// Gets or sets how much faster stamina will drain when wearing this armor. + /// + /// When attempting to set the value below 1 or above 2. + public float StaminaUseMultiplier { get; set; } + + /// + /// Gets or sets how much the users movement speed should be affected when wearing this armor. (higher values = slower movement). + /// + /// When attempting to set the value below 0 or above 1. + public float MovementSpeedMultiplier { get; set; } + + /// + /// Gets or sets the ammo limit of the wearer when using this armor. + /// + public IEnumerable AmmoLimits { get; set; } + + /// + /// Gets or sets the item caterory limit of the wearer when using this armor. + /// + public IEnumerable CategoryLimits { get; set; } + /// /// Returns the BodyArmorPickup in a human readable format. /// /// A string containing BodyArmorPickup related data. public override string ToString() => $"{Type} ({Serial}) [{Weight}] *{Scale}*"; + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is Armor armoritem) + { + helmetEfficacy = armoritem.HelmetEfficacy; + vestEfficacy = armoritem.VestEfficacy; + RemoveExcessOnDrop = armoritem.RemoveExcessOnDrop; + StaminaUseMultiplier = armoritem.StaminaUseMultiplier; + MovementSpeedMultiplier = armoritem.MovementSpeedMultiplier; + AmmoLimits = armoritem.AmmoLimits; + CategoryLimits = armoritem.CategoryLimits; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is Armor armoritem) + { + armoritem.HelmetEfficacy = helmetEfficacy; + armoritem.VestEfficacy = vestEfficacy; + armoritem.RemoveExcessOnDrop = RemoveExcessOnDrop; + armoritem.StaminaUseMultiplier = StaminaUseMultiplier; + armoritem.MovementSpeedMultiplier = MovementSpeedMultiplier; + armoritem.AmmoLimits = AmmoLimits; + armoritem.CategoryLimits = CategoryLimits; + } + + return item; + } } } diff --git a/Exiled.API/Features/Pickups/ExplosiveGrenadePickup.cs b/Exiled.API/Features/Pickups/ExplosiveGrenadePickup.cs new file mode 100644 index 0000000000..2fdbe16277 --- /dev/null +++ b/Exiled.API/Features/Pickups/ExplosiveGrenadePickup.cs @@ -0,0 +1,112 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Pickups +{ + using Exiled.API.Enums; + using Exiled.API.Features.Items; + using Exiled.API.Features.Pickups.Projectiles; + using InventorySystem.Items.ThrowableProjectiles; + + /// + /// A wrapper class for dropped Explosive Pickup. + /// + internal class ExplosiveGrenadePickup : GrenadePickup + { + /// + /// Initializes a new instance of the class. + /// + /// . + internal ExplosiveGrenadePickup(TimedGrenadePickup pickupBase) + : base(pickupBase) + { + } + + /// + /// Initializes a new instance of the class. + /// + internal ExplosiveGrenadePickup() + : base(ItemType.GrenadeHE) + { + } + + /// + /// Gets or sets the maximum radius of the grenade. + /// + public float MaxRadius { get; set; } + + /// + /// Gets or sets the multiplier for damage against players. + /// + public float ScpDamageMultiplier { get; set; } + + /// + /// Gets or sets how long the effect will last. + /// + public float BurnDuration { get; set; } + + /// + /// Gets or sets how long the effect will last. + /// + public float DeafenDuration { get; set; } + + /// + /// Gets or sets how long the effect will last. + /// + public float ConcussDuration { get; set; } + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is ExplosiveGrenade explosiveGrenadeitem) + { + MaxRadius = explosiveGrenadeitem.MaxRadius; + ScpDamageMultiplier = explosiveGrenadeitem.ScpDamageMultiplier; + BurnDuration = explosiveGrenadeitem.BurnDuration; + DeafenDuration = explosiveGrenadeitem.DeafenDuration; + ConcussDuration = explosiveGrenadeitem.ConcussDuration; + FuseTime = explosiveGrenadeitem.FuseTime; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is ExplosiveGrenade explosiveGrenadeitem) + { + explosiveGrenadeitem.MaxRadius = MaxRadius; + explosiveGrenadeitem.ScpDamageMultiplier = ScpDamageMultiplier; + explosiveGrenadeitem.BurnDuration = BurnDuration; + explosiveGrenadeitem.DeafenDuration = DeafenDuration; + explosiveGrenadeitem.ConcussDuration = ConcussDuration; + explosiveGrenadeitem.FuseTime = FuseTime; + } + + return item; + } + + /// + internal override Pickup GetPickupInfo(Projectile projectile) + { + if (projectile is ExplosionGrenadeProjectile explosionGrenadeProjectile) + { + explosionGrenadeProjectile.MaxRadius = MaxRadius; + explosionGrenadeProjectile.ScpDamageMultiplier = ScpDamageMultiplier; + explosionGrenadeProjectile.BurnDuration = BurnDuration; + explosionGrenadeProjectile.DeafenDuration = DeafenDuration; + explosionGrenadeProjectile.ConcussDuration = ConcussDuration; + explosionGrenadeProjectile.FuseTime = FuseTime; + } + + return projectile; + } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Pickups/FlashGrenadePickup.cs b/Exiled.API/Features/Pickups/FlashGrenadePickup.cs new file mode 100644 index 0000000000..f8dccbf981 --- /dev/null +++ b/Exiled.API/Features/Pickups/FlashGrenadePickup.cs @@ -0,0 +1,96 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Pickups +{ + using Exiled.API.Enums; + using Exiled.API.Features.Items; + using Exiled.API.Features.Pickups.Projectiles; + using InventorySystem.Items.ThrowableProjectiles; + + /// + /// A wrapper class for dropped Flash Pickup. + /// + internal class FlashGrenadePickup : GrenadePickup + { + /// + /// Initializes a new instance of the class. + /// + /// . + internal FlashGrenadePickup(TimedGrenadePickup pickupBase) + : base(pickupBase) + { + } + + /// + /// Initializes a new instance of the class. + /// + internal FlashGrenadePickup() + : base(ItemType.GrenadeFlash) + { + } + + /// + /// Gets or sets the minimum duration of player can take the effect. + /// + public float MinimalDurationEffect { get; set; } + + /// + /// Gets or sets the additional duration of the effect. + /// + public float AdditionalBlindedEffect { get; set; } + + /// + /// Gets or sets the how mush the flash grenade going to be intensified when explode at . + /// + public float SurfaceDistanceIntensifier { get; set; } + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is FlashGrenade flashGrenadeitem) + { + MinimalDurationEffect = flashGrenadeitem.MinimalDurationEffect; + AdditionalBlindedEffect = flashGrenadeitem.AdditionalBlindedEffect; + SurfaceDistanceIntensifier = flashGrenadeitem.SurfaceDistanceIntensifier; + FuseTime = flashGrenadeitem.FuseTime; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is FlashGrenade flashGrenadeitem) + { + flashGrenadeitem.MinimalDurationEffect = MinimalDurationEffect; + flashGrenadeitem.AdditionalBlindedEffect = AdditionalBlindedEffect; + flashGrenadeitem.SurfaceDistanceIntensifier = SurfaceDistanceIntensifier; + flashGrenadeitem.FuseTime = FuseTime; + } + + return item; + } + + /// + internal override Pickup GetPickupInfo(Projectile projectile) + { + if (projectile is FlashbangProjectile flashbangProjectile) + { + flashbangProjectile.MinimalDurationEffect = MinimalDurationEffect; + flashbangProjectile.AdditionalBlindedEffect = AdditionalBlindedEffect; + flashbangProjectile.SurfaceDistanceIntensifier = SurfaceDistanceIntensifier; + flashbangProjectile.FuseTime = FuseTime; + } + + return projectile; + } + } +} diff --git a/Exiled.API/Features/Pickups/GrenadePickup.cs b/Exiled.API/Features/Pickups/GrenadePickup.cs index 83c39ead54..f9b29a6ac7 100644 --- a/Exiled.API/Features/Pickups/GrenadePickup.cs +++ b/Exiled.API/Features/Pickups/GrenadePickup.cs @@ -9,8 +9,11 @@ namespace Exiled.API.Features.Pickups { using Exiled.API.Enums; using Exiled.API.Extensions; + using Exiled.API.Features.Pickups.Projectiles; using Exiled.API.Interfaces; + using Footprinting; + using InventorySystem.Items.ThrowableProjectiles; /// @@ -38,6 +41,11 @@ internal GrenadePickup(ItemType type) Base = (TimedGrenadePickup)((Pickup)this).Base; } + /// + /// Gets or sets how long the fuse will last. + /// + public float FuseTime { get; set; } + /// /// Gets the of the item. /// @@ -51,6 +59,31 @@ internal GrenadePickup(ItemType type) /// /// Trigger the grenade to make it Explode. /// - public void Explode() => Base._replaceNextFrame = true; + public void Explode() => Explode(Base.PreviousOwner); + + /// + /// Trigger the grenade to make it Explode. + /// + /// The of the explosion. + public void Explode(Footprint attacker) + { + Base._replaceNextFrame = true; + Base._attacker = attacker; + } + + /// + /// Returns the Projectile with the according property from the Pickup. + /// + /// Pickup-related data to give to the Projectile. + /// A Projectile containing the Pickup-related data. + internal virtual Pickup GetPickupInfo(Projectile projectile) + { + if (projectile is TimeGrenadeProjectile timeGrenadeProjectile) + { + timeGrenadeProjectile.FuseTime = FuseTime; + } + + return projectile; + } } } diff --git a/Exiled.API/Features/Pickups/JailbirdPickup.cs b/Exiled.API/Features/Pickups/JailbirdPickup.cs index 67c6f17df6..aa32d75fb0 100644 --- a/Exiled.API/Features/Pickups/JailbirdPickup.cs +++ b/Exiled.API/Features/Pickups/JailbirdPickup.cs @@ -7,10 +7,10 @@ namespace Exiled.API.Features.Pickups { + using Exiled.API.Features.Items; using Exiled.API.Interfaces; using InventorySystem.Items.Jailbird; - using UnityEngine; using BaseJailbirdPickup = InventorySystem.Items.Jailbird.JailbirdPickup; @@ -19,26 +19,6 @@ namespace Exiled.API.Features.Pickups /// public class JailbirdPickup : Pickup, IWrapper { - /// - /// Number of Charges use before the weapon become AlmostDepleted. - /// - public const int ChargesWarning = JailbirdItem.ChargesWarning; - - /// - /// Number of Charges use before the weapon will being destroy. - /// - public const int ChargesLimit = JailbirdItem.ChargesLimit; - - /// - /// Number of Damage made before the weapon become AlmostDepleted. - /// - public const float DamageWarning = JailbirdItem.DamageWarning; - - /// - /// Number of Damage made before the weapon will being destroy. - /// - public const float DamageLimit = JailbirdItem.DamageLimit; - /// /// Initializes a new instance of the class. /// @@ -63,6 +43,26 @@ internal JailbirdPickup() /// public new BaseJailbirdPickup Base { get; } + /// + /// Gets or sets the amount of damage dealt with a Jailbird melee hit. + /// + public float MeleeDamage { get; set; } + + /// + /// Gets or sets the amount of damage dealt with a Jailbird charge hit. + /// + public float ChargeDamage { get; set; } + + /// + /// Gets or sets the amount of time in seconds that the effect will be applied on being hit. + /// + public float FlashDuration { get; set; } + + /// + /// Gets or sets the radius of the Jailbird's hit register. + /// + public float Radius { get; set; } + /// /// Gets or sets the total amount of damage dealt with the Jailbird. /// @@ -72,17 +72,6 @@ public float TotalDamageDealt set => Base.TotalMelee = value; } - /// - /// Gets or sets the amount of damage remaining before the Jailbird breaks. - /// - /// Modifying this value will directly modify . - /// - public float RemainingDamage - { - get => JailbirdItem.DamageLimit - TotalDamageDealt; - set => TotalDamageDealt = Mathf.Clamp(JailbirdItem.DamageLimit - value, 0, JailbirdItem.DamageLimit); - } - /// /// Gets or sets the number of times the item has been charged and used. /// @@ -93,35 +82,48 @@ public int TotalCharges } /// - /// Gets or sets the amount of charges remaining before the Jailbird breaks. + /// Gets or sets the of the item. /// - /// Modifying this value will directly modify . - /// - public int RemainingCharges + public JailbirdWearState WearState { - get => JailbirdItem.ChargesLimit - TotalCharges; - set => TotalCharges = Mathf.Clamp(JailbirdItem.ChargesLimit - value, 0, JailbirdItem.ChargesLimit); + get => Base.NetworkWear; + set => Base.NetworkWear = value; } - /// - /// Gets a value indicating whether the weapon warn the player than the Item will be broken. - /// - public bool IsAlmostDepleted => IsDamageWarning || IsChargesWarning; - - /// - /// Gets a value indicating whether . - /// - public bool IsDamageWarning => TotalDamageDealt >= DamageWarning; - - /// - /// Gets a value indicating whether . - /// - public bool IsChargesWarning => TotalCharges >= ChargesWarning; - /// /// Returns the jailbird in a human readable format. /// /// A string containing jailbird related data. public override string ToString() => $"{Type} ({Serial}) [{Weight}] *{Scale}*"; + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is Jailbird jailBirditem) + { + MeleeDamage = jailBirditem.MeleeDamage; + ChargeDamage = jailBirditem.ChargeDamage; + FlashDuration = jailBirditem.FlashDuration; + Radius = jailBirditem.Radius; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is Jailbird jailBirditem) + { + jailBirditem.MeleeDamage = MeleeDamage; + jailBirditem.ChargeDamage = ChargeDamage; + jailBirditem.FlashDuration = FlashDuration; + jailBirditem.Radius = Radius; + } + + return item; + } } } diff --git a/Exiled.API/Features/Pickups/KeycardPickup.cs b/Exiled.API/Features/Pickups/KeycardPickup.cs index fc2a6c3f0d..ff6729e1ef 100644 --- a/Exiled.API/Features/Pickups/KeycardPickup.cs +++ b/Exiled.API/Features/Pickups/KeycardPickup.cs @@ -7,6 +7,8 @@ namespace Exiled.API.Features.Pickups { + using Exiled.API.Enums; + using Exiled.API.Features.Items; using Exiled.API.Interfaces; using BaseKeycard = InventorySystem.Items.Keycards.KeycardPickup; @@ -36,9 +38,38 @@ internal KeycardPickup(ItemType type) Base = (BaseKeycard)((Pickup)this).Base; } + /// + /// Gets or sets the of the keycard. + /// + public KeycardPermissions Permissions { get; set; } + /// /// Gets the that this class is encapsulating. /// public new BaseKeycard Base { get; } + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is Keycard keycarditem) + { + Permissions = keycarditem.Permissions; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is Keycard keycarditem) + { + keycarditem.Permissions = Permissions; + } + + return item; + } } } diff --git a/Exiled.API/Features/Pickups/Pickup.cs b/Exiled.API/Features/Pickups/Pickup.cs index 43cf3be3a8..7ea7dc5727 100644 --- a/Exiled.API/Features/Pickups/Pickup.cs +++ b/Exiled.API/Features/Pickups/Pickup.cs @@ -45,6 +45,16 @@ public class Pickup : TypeCastObject, IWrapper, IWorldSp /// internal static readonly Dictionary BaseToPickup = new(new ComponentsEqualityComparer()); + /// + /// Initializes a new instance of the class. + /// + /// + /// Created only for properly work. + /// + internal Pickup() + { + } + /// /// Initializes a new instance of the class. /// @@ -75,10 +85,11 @@ internal Pickup(ItemType type) { ItemId = type, Serial = ItemSerialGenerator.GenerateNext(), - Weight = itemBase.Weight, + WeightKg = itemBase.Weight, }; Info = psi; + BaseToPickup.Add(Base, this); } @@ -97,23 +108,35 @@ internal Pickup(ItemType type) /// public Transform Transform => Base.transform; + /// + /// Gets the of the Pickup. + /// + public Rigidbody Rigidbody => PhysicsModule?.Rb; + /// /// Gets the current the Pickup is in. /// public Room Room => Room.FindParentRoom(GameObject); /// - /// Gets or sets the unique serial number for the item. + /// Gets or sets the pickup's PhysicsModule. /// - public ushort Serial + public PickupStandardPhysics PhysicsModule { - get + get => Base.PhysicsModule as PickupStandardPhysics; + set { - if (Base.Info.Serial is 0) - return Serial = ItemSerialGenerator.GenerateNext(); - return Base.Info.Serial; + Base.PhysicsModule.DestroyModule(); + Base.PhysicsModule = value; } + } + /// + /// Gets or sets the unique serial number for the item. + /// + public ushort Serial + { + get => Base.Info.Serial; set { Base.Info.Serial = value; @@ -147,10 +170,10 @@ public Vector3 Scale /// public float Weight { - get => Info.Weight; + get => Info.WeightKg; set { - Base.Info.Weight = value; + Base.Info.WeightKg = value; Info = Base.Info; } } @@ -168,9 +191,9 @@ public float PickupTime } /// - /// Gets the of the item. + /// Gets or sets the of the item. /// - public ItemPickupBase Base { get; } + public ItemPickupBase Base { get; protected set; } /// /// Gets the of the item. @@ -234,12 +257,8 @@ public bool InUse /// public Vector3 Position { - get => Base.transform.position; - set - { - Base.transform.position = value; - Base.RefreshPositionAndRotation(); - } + get => Base.Position; + set => Base.Position = value; } /// @@ -247,7 +266,7 @@ public Vector3 Position /// public RelativePosition RelativePosition { - get => Base.Info.RelativePosition; + get => new(Room.transform.TransformPoint(Position)); set => Position = value.Position; } @@ -257,12 +276,8 @@ public RelativePosition RelativePosition /// public Quaternion Rotation { - get => Base.transform.rotation; - set - { - Base.transform.rotation = value; - Base.RefreshPositionAndRotation(); - } + get => Base.Rotation; + set => Base.Rotation = value; } /// @@ -270,6 +285,11 @@ public Quaternion Rotation /// public bool IsSpawned { get; internal set; } + /// + /// Gets a value indicating whether or not this is a worn item. + /// + public bool IsLoaded { get; internal set; } + /// /// Gets an existing or creates a new instance of one. /// @@ -289,7 +309,12 @@ public static Pickup Get(ItemPickupBase pickupBase) BaseAmmoPickup ammoPickup => new AmmoPickup(ammoPickup), BaseRadioPickup radioPickup => new RadioPickup(radioPickup), BaseMicroHIDPickup microHidPickup => new MicroHIDPickup(microHidPickup), - TimedGrenadePickup timeGrenade => new GrenadePickup(timeGrenade), + TimedGrenadePickup timeGrenade => timeGrenade.NetworkInfo.ItemId switch + { + ItemType.GrenadeHE => new ExplosiveGrenadePickup(), + ItemType.GrenadeFlash => new FlashGrenadePickup(), + _ => new GrenadePickup(timeGrenade), + }, BaseFirearmPickup firearmPickup => new FirearmPickup(firearmPickup), BaseKeycardPickup keycardPickup => new KeycardPickup(keycardPickup), BaseBodyArmorPickup bodyArmorPickup => new BodyArmorPickup(bodyArmorPickup), @@ -339,7 +364,7 @@ public static Pickup Get(ItemPickupBase pickupBase) ///
- All valid firearms (not including the Micro HID) should be casted to the class. ///
- All valid keycards should be casted to the class. ///
- All valid armor should be casted to the class. - ///
- All grenades and throwables (SCP-018 and SCP-2176) should be casted to the class. + ///
- All grenades and throwables (not including SCP-018 and SCP-2176) should be casted to the class. /// /// ///
The following have their own respective classes: @@ -347,6 +372,8 @@ public static Pickup Get(ItemPickupBase pickupBase) ///
- The Micro HID can be casted to . ///
- SCP-244 A and B variants can be casted to . ///
- SCP-330 can be casted to . + ///
- SCP-018 can be casted to . + ///
- SCP-2176 can be casted to . ///
/// /// Items that are not listed above do not have a subclass, and can only use the base class. @@ -361,11 +388,17 @@ public static Pickup Get(ItemPickupBase pickupBase) ItemType.Ammo9x19 or ItemType.Ammo12gauge or ItemType.Ammo44cal or ItemType.Ammo556x45 or ItemType.Ammo762x39 => new AmmoPickup(type), ItemType.Radio => new RadioPickup(), ItemType.MicroHID => new MicroHIDPickup(), - ItemType.GrenadeHE or ItemType.GrenadeFlash => new GrenadePickup(type), - ItemType.GunCrossvec or ItemType.GunLogicer or ItemType.GunRevolver or ItemType.GunShotgun or ItemType.GunAK or ItemType.GunCOM15 or ItemType.GunCOM18 or ItemType.GunE11SR or ItemType.GunFSP9 or ItemType.ParticleDisruptor => new FirearmPickup(type), - ItemType.KeycardGuard or ItemType.KeycardJanitor or ItemType.KeycardO5 or ItemType.KeycardScientist or ItemType.KeycardContainmentEngineer or ItemType.KeycardFacilityManager or ItemType.KeycardResearchCoordinator or ItemType.KeycardZoneManager or ItemType.KeycardNTFCommander or ItemType.KeycardNTFLieutenant or ItemType.KeycardNTFOfficer => new KeycardPickup(type), + ItemType.GrenadeFlash => new FlashGrenadePickup(), + ItemType.GrenadeHE => new ExplosiveGrenadePickup(), + ItemType.GunCrossvec or ItemType.GunLogicer or ItemType.GunRevolver or ItemType.GunShotgun or ItemType.GunAK or ItemType.GunCOM15 or ItemType.GunCOM18 or ItemType.GunE11SR or ItemType.GunFSP9 or ItemType.ParticleDisruptor or ItemType.GunA7 or ItemType.GunFRMG0 => new FirearmPickup(type), + ItemType.KeycardGuard or ItemType.KeycardJanitor or ItemType.KeycardO5 or ItemType.KeycardScientist or ItemType.KeycardContainmentEngineer or ItemType.KeycardFacilityManager or ItemType.KeycardResearchCoordinator or ItemType.KeycardZoneManager or ItemType.KeycardMTFCaptain or ItemType.KeycardMTFOperative or ItemType.KeycardMTFPrivate => new KeycardPickup(type), ItemType.ArmorLight or ItemType.ArmorCombat or ItemType.ArmorHeavy => new BodyArmorPickup(type), ItemType.SCP330 => new Scp330Pickup(), + ItemType.SCP500 or ItemType.SCP268 or ItemType.SCP207 or ItemType.SCP1853 or ItemType.Painkillers or ItemType.Medkit or ItemType.Adrenaline => new UsablePickup(type), + ItemType.Jailbird => new JailbirdPickup(), + ItemType.SCP1576 => new Scp1576Pickup(), + ItemType.SCP2176 => new Projectiles.Scp2176Projectile(), + ItemType.SCP018 => new Projectiles.Scp018Projectile(), _ => new Pickup(type), }; @@ -399,17 +432,6 @@ public static Pickup Spawn(Pickup pickup, Vector3 position, Quaternion rotation, return pickup; } - /// - /// Clones current object. - /// - /// New object. - public Pickup Clone() => new(Type) - { - Scale = Scale, - PreviousOwner = PreviousOwner, - Info = Info, - }; - /// /// Returns the amount of time it will take for the provided to pick up this item, based on and active status effects. /// @@ -431,6 +453,12 @@ public float PickupTimeForPlayer(Player player) /// public void Spawn() { + // condition for projectiles + if (!GameObject.activeSelf) + { + GameObject.SetActive(true); + } + if (!IsSpawned) { NetworkServer.Spawn(GameObject); @@ -458,10 +486,53 @@ public void UnSpawn() /// public void Destroy() => Base.DestroySelf(); + /// + /// Clones the current pickup with a different serial. + /// + /// Cloned pickup object. + public virtual Pickup Clone() => new(Type) + { + Scale = Scale, + PreviousOwner = PreviousOwner, + Info = Info, + }; + /// /// Returns the Pickup in a human readable format. /// /// A string containing Pickup-related data. public override string ToString() => $"{Type} ({Serial}) [{Weight}] *{Scale}* |{Position}| -{IsLocked}- ={InUse}="; + + /// + /// Returns the Pickup with the according property from the Item. + /// + /// Item-related data to give to the Pickup. + /// A Pickup containing the Item-related data. + internal virtual Pickup GetItemInfo(Items.Item item) + { + IsLoaded = true; + + if (item is not null) + { + Scale = item.Scale; + } + + return this; + } + + /// + /// Returns the Item with the according property from the Pickup. + /// + /// Pickup-related data to give to the Item. + /// A Item containing the Pickup-related data. + internal virtual Items.Item GetPickupInfo(Items.Item item) + { + if (item is not null) + { + item.Scale = Scale; + } + + return item; + } } } diff --git a/Exiled.API/Features/Pickups/Projectiles/ExplosionGrenadeProjectile.cs b/Exiled.API/Features/Pickups/Projectiles/ExplosionGrenadeProjectile.cs index b15b33601d..2afb3e9187 100644 --- a/Exiled.API/Features/Pickups/Projectiles/ExplosionGrenadeProjectile.cs +++ b/Exiled.API/Features/Pickups/Projectiles/ExplosionGrenadeProjectile.cs @@ -14,8 +14,6 @@ namespace Exiled.API.Features.Pickups.Projectiles using PlayerRoles; - using UnityEngine; - /// /// A wrapper class for ExplosionGrenade. /// diff --git a/Exiled.API/Features/Pickups/Projectiles/Projectile.cs b/Exiled.API/Features/Pickups/Projectiles/Projectile.cs index 4a1a82dda5..fc25c68d14 100644 --- a/Exiled.API/Features/Pickups/Projectiles/Projectile.cs +++ b/Exiled.API/Features/Pickups/Projectiles/Projectile.cs @@ -11,6 +11,9 @@ namespace Exiled.API.Features.Pickups.Projectiles using Exiled.API.Extensions; using Exiled.API.Interfaces; + using InventorySystem; + using InventorySystem.Items; + using InventorySystem.Items.Pickups; using InventorySystem.Items.ThrowableProjectiles; using UnityEngine; @@ -35,9 +38,23 @@ internal Projectile(ThrownProjectile pickupBase) ///
/// The of the pickup. internal Projectile(ItemType type) - : base(type) { - Base = (ThrownProjectile)((Pickup)this).Base; + if (!InventoryItemLoader.AvailableItems.TryGetValue(type, out ItemBase itemBase) || itemBase is not ThrowableItem throwable) + return; + + throwable.Projectile.gameObject.SetActive(false); + base.Base = Base = Object.Instantiate(throwable.Projectile); + throwable.Projectile.gameObject.SetActive(true); + + PickupSyncInfo psi = new() + { + ItemId = type, + Serial = ItemSerialGenerator.GenerateNext(), + WeightKg = itemBase.Weight, + }; + + Info = psi; + BaseToPickup.Add(Base, this); } /// @@ -72,7 +89,7 @@ internal Projectile(ItemType type) ProjectileType.Flashbang => new FlashbangProjectile(), ProjectileType.Scp2176 => new Scp2176Projectile(), ProjectileType.FragGrenade => new ExplosionGrenadeProjectile(ItemType.GrenadeHE), - _ => throw new System.Exception($"ProjectilType does not contain a valid value :{projectiletype}"), + _ => throw new System.Exception($"ProjectileType does not contain a valid value : {projectiletype}"), }; /// diff --git a/Exiled.API/Features/Pickups/Projectiles/Scp018Projectile.cs b/Exiled.API/Features/Pickups/Projectiles/Scp018Projectile.cs index 92e15258bc..c5549c87f4 100644 --- a/Exiled.API/Features/Pickups/Projectiles/Scp018Projectile.cs +++ b/Exiled.API/Features/Pickups/Projectiles/Scp018Projectile.cs @@ -16,7 +16,7 @@ namespace Exiled.API.Features.Pickups.Projectiles /// /// A wrapper class for Scp018Projectile. /// - public class Scp018Projectile : ExplosionGrenadeProjectile, IWrapper + public class Scp018Projectile : TimeGrenadeProjectile, IWrapper { /// /// Initializes a new instance of the class. @@ -42,6 +42,37 @@ internal Scp018Projectile() /// public new BaseScp018Projectile Base { get; } + /// + /// Gets or sets the pickup's PhysicsModule. + /// + public new Scp018Physics PhysicsModule + { + get => Base.PhysicsModule as Scp018Physics; + set + { + Base.PhysicsModule.DestroyModule(); + Base.PhysicsModule = value; + } + } + + /// + /// Gets or sets the pickup's max velocity. + /// + public float MaxVelocity + { + get => PhysicsModule._maxVel; + set => PhysicsModule = new Scp018Physics(Base, PhysicsModule._trail, PhysicsModule._radius, value, PhysicsModule._velPerBounce); + } + + /// + /// Gets or sets the pickup's velocity per bounce. + /// + public float VelocityPerBounce + { + get => PhysicsModule._maxVel; + set => PhysicsModule = new Scp018Physics(Base, PhysicsModule._trail, PhysicsModule._radius, MaxVelocity, value); + } + /// /// Gets a value indicating whether or not SCP-018 can injure teammates. /// diff --git a/Exiled.API/Features/Pickups/Projectiles/TimeGrenadeProjectile.cs b/Exiled.API/Features/Pickups/Projectiles/TimeGrenadeProjectile.cs index f9633939ff..d184e44ff0 100644 --- a/Exiled.API/Features/Pickups/Projectiles/TimeGrenadeProjectile.cs +++ b/Exiled.API/Features/Pickups/Projectiles/TimeGrenadeProjectile.cs @@ -7,12 +7,11 @@ namespace Exiled.API.Features.Pickups.Projectiles { - using Exiled.API.Enums; using Exiled.API.Interfaces; using InventorySystem.Items.ThrowableProjectiles; - using UnityEngine; + using Mirror; /// /// A wrapper class for TimeGrenade. @@ -57,10 +56,9 @@ public float FuseTime get => Base._fuseTime; set { + Base._fuseTime = value; if (IsActive) - Base.RpcSetTime(value); - else - Base._fuseTime = value; + Base.TargetTime = NetworkTime.time + value; } } @@ -69,13 +67,13 @@ public float FuseTime /// public bool IsActive { - get => Base.TargetTime != 0.0f; + get => Base.TargetTime != 0.0; set { - if (value && Base.TargetTime == 0.0f) - Base.RpcSetTime(FuseTime); - else if (!value && Base.TargetTime != 0.0f) - Base.RpcSetTime(-Time.timeSinceLevelLoad); + if (value && Base.TargetTime == 0.0) + Base.TargetTime = FuseTime; + else if (!value && Base.TargetTime != 0.0) + Base.TargetTime = 0.0; } } diff --git a/Exiled.API/Features/Pickups/Scp244Pickup.cs b/Exiled.API/Features/Pickups/Scp244Pickup.cs index cd6c93aa3f..7064807ff6 100644 --- a/Exiled.API/Features/Pickups/Scp244Pickup.cs +++ b/Exiled.API/Features/Pickups/Scp244Pickup.cs @@ -19,7 +19,7 @@ namespace Exiled.API.Features.Pickups /// /// A wrapper class for a SCP-244 pickup. /// - public class Scp244Pickup : Pickup, IWrapper + public class Scp244Pickup : UsablePickup, IWrapper { /// /// Initializes a new instance of the class. diff --git a/Exiled.API/Features/Pickups/Scp330Pickup.cs b/Exiled.API/Features/Pickups/Scp330Pickup.cs index 679f931a6d..4410e4300b 100644 --- a/Exiled.API/Features/Pickups/Scp330Pickup.cs +++ b/Exiled.API/Features/Pickups/Scp330Pickup.cs @@ -18,7 +18,7 @@ namespace Exiled.API.Features.Pickups /// /// A wrapper class for dropped SCP-330 bags. /// - public class Scp330Pickup : Pickup, IWrapper + public class Scp330Pickup : UsablePickup, IWrapper { /// /// Initializes a new instance of the class. diff --git a/Exiled.API/Features/Pickups/UsablePickup.cs b/Exiled.API/Features/Pickups/UsablePickup.cs new file mode 100644 index 0000000000..bf16a134bb --- /dev/null +++ b/Exiled.API/Features/Pickups/UsablePickup.cs @@ -0,0 +1,72 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Pickups +{ + using Exiled.API.Features.Items; + using InventorySystem.Items.Pickups; + + /// + /// A wrapper class for dropped Usable Pickup. + /// + public class UsablePickup : Pickup + { + /// + /// Initializes a new instance of the class. + /// + /// . + internal UsablePickup(ItemPickupBase pickupBase) + : base(pickupBase) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// . + internal UsablePickup(ItemType type) + : base(type) + { + } + + /// + /// Gets or sets how long it takes to use the item. + /// + public float UseTime { get; set; } + + /// + /// Gets or sets how long after using starts a player has to cancel using the item. + /// + public float MaxCancellableTime { get; set; } + + /// + internal override Pickup GetItemInfo(Item item) + { + base.GetItemInfo(item); + if (item is Usable usableitem) + { + UseTime = usableitem.UseTime; + MaxCancellableTime = usableitem.MaxCancellableTime; + } + + return this; + } + + /// + internal override Item GetPickupInfo(Item item) + { + base.GetPickupInfo(item); + if (item is Usable usableitem) + { + usableitem.UseTime = UseTime; + usableitem.MaxCancellableTime = MaxCancellableTime; + } + + return item; + } + } +} diff --git a/Exiled.API/Features/Player.cs b/Exiled.API/Features/Player.cs index ec119dec5d..839cb4c9d1 100644 --- a/Exiled.API/Features/Player.cs +++ b/Exiled.API/Features/Player.cs @@ -14,31 +14,23 @@ namespace Exiled.API.Features using System.Runtime.CompilerServices; using Core; - using CustomPlayerEffects; - using DamageHandlers; - using Enums; - using Exiled.API.Features.Core.Interfaces; + using Exiled.API.Features.Doors; + using Exiled.API.Features.Hazards; using Exiled.API.Features.Items; using Exiled.API.Features.Pickups; using Exiled.API.Features.Pools; using Exiled.API.Features.Roles; using Exiled.API.Interfaces; using Exiled.API.Structs; - using Extensions; - using Footprinting; - using global::Scp914; - using Hints; - using Interactables.Interobjects; - using InventorySystem; using InventorySystem.Disarming; using InventorySystem.Items; @@ -48,36 +40,23 @@ namespace Exiled.API.Features using InventorySystem.Items.Firearms.BasicMessages; using InventorySystem.Items.Usables; using InventorySystem.Items.Usables.Scp330; - using MapGeneration.Distributors; - using MEC; - using Mirror; using Mirror.LiteNetLib4Mirror; - using NorthwoodLib; - using PlayerRoles; using PlayerRoles.FirstPersonControl; - using PlayerRoles.PlayableScps.Scp079; - using PlayerRoles.PlayableScps.Scp106; - using PlayerRoles.PlayableScps.Scp173; - using PlayerRoles.PlayableScps.Scp939; using PlayerRoles.RoleAssign; using PlayerRoles.Spectating; using PlayerRoles.Voice; - using PlayerStatsSystem; using RelativePositioning; using RemoteAdmin; - using RoundRestarting; - using UnityEngine; - + using Utils; using Utils.Networking; - using VoiceChat; using VoiceChat.Playbacks; @@ -85,14 +64,14 @@ namespace Exiled.API.Features using DamageHandlerBase = PlayerStatsSystem.DamageHandlerBase; using Firearm = Items.Firearm; - using FirearmPickup = Exiled.API.Features.Pickups.FirearmPickup; + using FirearmPickup = Pickups.FirearmPickup; using HumanRole = Roles.HumanRole; using Random = UnityEngine.Random; /// /// Represents the in-game player, by encapsulating a . /// - public class Player : IEntity, IPosition // Todo: Convert to IWorldSpace (Rotation Vector3 -> Quaternion) + public class Player : IEntity, IWorldSpace { #pragma warning disable SA1401 /// @@ -101,7 +80,6 @@ public class Player : IEntity, IPosition // Todo: Convert to IWorldSpace (Rotati internal readonly List ItemsValue = new(8); #pragma warning restore SA1401 - private readonly IReadOnlyCollection readOnlyItems; private readonly HashSet componentsInChildren = new(); private ReferenceHub referenceHub; @@ -114,8 +92,8 @@ public class Player : IEntity, IPosition // Todo: Convert to IWorldSpace (Rotati /// The of the player to be encapsulated. public Player(ReferenceHub referenceHub) { - readOnlyItems = ItemsValue.AsReadOnly(); ReferenceHub = referenceHub; + Items = ItemsValue.AsReadOnly(); } /// @@ -124,8 +102,8 @@ public Player(ReferenceHub referenceHub) /// The of the player. public Player(GameObject gameObject) { - readOnlyItems = ItemsValue.AsReadOnly(); ReferenceHub = ReferenceHub.GetHub(gameObject); + Items = ItemsValue.AsReadOnly(); } /// @@ -146,18 +124,13 @@ public Player(GameObject gameObject) /// /// Gets a list of all 's on the server. /// - public static IEnumerable List => Dictionary.Values; + public static IReadOnlyCollection List => Dictionary.Values; /// /// Gets a containing cached and their user ids. /// public static Dictionary UserIdsCache { get; } = new(20); - /// - /// Gets a containing cached and their ids. - /// - public static Dictionary IdsCache { get; } = new(20); - /// public IReadOnlyCollection ComponentsInChildren => componentsInChildren; @@ -303,17 +276,13 @@ public AuthenticationType AuthenticationType if (string.IsNullOrEmpty(UserId)) return AuthenticationType.Unknown; - int index = UserId.LastIndexOf('@'); - - if (index == -1) - return AuthenticationType.Unknown; - - return UserId.Substring(index + 1) switch + return UserId.Substring(UserId.LastIndexOf('@') + 1) switch { "steam" => AuthenticationType.Steam, "discord" => AuthenticationType.Discord, "northwood" => AuthenticationType.Northwood, - "patreon" => AuthenticationType.Patreon, + "localhost" => AuthenticationType.LocalHost, + "ID_Dedicated" => AuthenticationType.DedicatedServer, _ => AuthenticationType.Unknown, }; } @@ -327,6 +296,11 @@ public AuthenticationType AuthenticationType /// public bool IsVerified { get; internal set; } + /// + /// Gets or sets a value indicating whether or not the player is a NPC. + /// + public bool IsNPC { get; set; } + /// /// Gets a value indicating whether or not the player has an active CustomName. /// @@ -373,6 +347,39 @@ public string CustomInfo get => ReferenceHub.nicknameSync.Network_customPlayerInfoString; set { + // NW Client check. + if (value.Contains('<')) + { + foreach (var token in value.Split('<')) + { + if (token.StartsWith("/", StringComparison.Ordinal) || + token.StartsWith("b>", StringComparison.Ordinal) || + token.StartsWith("i>", StringComparison.Ordinal) || + token.StartsWith("size=", StringComparison.Ordinal) || + token.Length is 0) + continue; + + if (token.StartsWith("color=", StringComparison.Ordinal)) + { + if (token.Length < 14 || token[13] != '>') + Log.Error($"Custom info of player {Nickname} has been REJECTED. \nreason: (Bad text reject) \ntoken: {token} \nInfo: {value}"); + else if (!Misc.AllowedColors.ContainsValue(token.Substring(6, 7))) + Log.Error($"Custom info of player {Nickname} has been REJECTED. \nreason: (Bad color reject) \ntoken: {token} \nInfo: {value}"); + } + else if (token.StartsWith("#", StringComparison.Ordinal)) + { + if (token.Length < 8 || token[7] != '>') + Log.Error($"Custom info of player {Nickname} has been REJECTED. \nreason: (Bad text reject) \ntoken: {token} \nInfo: {value}"); + else if (!Misc.AllowedColors.ContainsValue(token.Substring(0, 7))) + Log.Error($"Custom info of player {Nickname} has been REJECTED. \nreason: (Bad color reject) \ntoken: {token} \nInfo: {value}"); + } + else + { + Log.Error($"Custom info of player {Nickname} has been REJECTED. \nreason: (Bad color reject) \ntoken: {token} \nInfo: {value}"); + } + } + } + InfoArea = string.IsNullOrEmpty(value) ? InfoArea & ~PlayerInfoArea.CustomInfo : InfoArea |= PlayerInfoArea.CustomInfo; ReferenceHub.nicknameSync.Network_customPlayerInfoString = value; } @@ -504,10 +511,10 @@ public RelativePosition RelativePosition /// Gets or sets the player's rotation. /// /// Returns the direction the player is looking at. - public Vector3 Rotation + public Quaternion Rotation { - get => Transform.eulerAngles; - set => ReferenceHub.TryOverridePosition(Position, value - Rotation); + get => Transform.rotation; + set => ReferenceHub.TryOverridePosition(Position, value.eulerAngles); } /// @@ -536,10 +543,10 @@ public PlayerPermissions RemoteAdminPermissions ///
= . ///
= . ///
= . - ///
= . - ///
= . + ///
= . + ///
= . ///
= . - ///
= . + ///
= . ///
= . ///
= . ///
= . @@ -579,7 +586,7 @@ public ScpSpawnPreferences.SpawnPreferences ScpPreferences /// Gets a value indicating whether or not the player is cuffed. ///
/// Players can be cuffed without another player being the cuffer. - public bool IsCuffed => Cuffer is not null; + public bool IsCuffed => Inventory.IsDisarmed(); /// /// Gets a value indicating whether or not the player is reloading a weapon. @@ -1019,7 +1026,7 @@ public bool BadgeHidden if (value) ReferenceHub.characterClassManager.UserCode_CmdRequestHideTag(); else - ReferenceHub.characterClassManager.UserCode_CmdRequestShowTag(false); + ReferenceHub.characterClassManager.UserCode_CmdRequestShowTag__Boolean(false); } } @@ -1036,7 +1043,7 @@ public bool BadgeHidden /// /// Gets a value indicating whether or not the player is in the pocket dimension. /// - public bool IsInPocketDimension => CurrentRoom?.Type == RoomType.Pocket; + public bool IsInPocketDimension => CurrentRoom?.Type is RoomType.Pocket; /// /// Gets or sets a value indicating whether or not the player should use stamina system. @@ -1051,12 +1058,12 @@ public bool BadgeHidden /// /// Gets the player's items. /// - public IReadOnlyCollection Items => readOnlyItems; + public IReadOnlyCollection Items { get; } /// /// Gets a value indicating whether or not the player's inventory is empty. /// - public bool IsInventoryEmpty => Items.Count == 0; + public bool IsInventoryEmpty => Items.Count is 0; /// /// Gets a value indicating whether or not the player's inventory is full. @@ -1101,7 +1108,7 @@ public bool IsSpawnProtected /// /// Gets a dictionary for storing player objects of connected but not yet verified players. /// - internal static ConditionalWeakTable UnverifiedPlayers { get; } = new(); + internal static ConditionalWeakTable UnverifiedPlayers { get; } = new(); /// /// Converts NwPluginAPI player to EXILED player. @@ -1145,6 +1152,13 @@ public bool IsSpawnProtected /// A or if not found. public static Player Get(CommandSystem.ICommandSender sender) => Get(sender as CommandSender); + /// + /// Gets the belonging to the , if any. + /// + /// The Footprint. + /// A or if not found. + public static Player Get(Footprint footprint) => Get(footprint.Hub); + /// /// Gets the belonging to the , if any. /// @@ -1207,8 +1221,10 @@ public static Player Get(GameObject gameObject) if (gameObject == null) return null; - Dictionary.TryGetValue(gameObject, out Player player); + if (Dictionary.TryGetValue(gameObject, out Player player)) + return player; + UnverifiedPlayers.TryGetValue(gameObject, out player); return player; } @@ -1217,23 +1233,7 @@ public static Player Get(GameObject gameObject) /// /// The player id. /// Returns the player found or if not found. - public static Player Get(int id) - { - if (IdsCache.TryGetValue(id, out Player player) && player?.ReferenceHub is not null) - return player; - - foreach (Player playerFound in Dictionary.Values) - { - if (playerFound.Id != id) - continue; - - IdsCache[id] = playerFound; - - return playerFound; - } - - return null; - } + public static Player Get(int id) => ReferenceHub.TryGetHub(id, out ReferenceHub referenceHub) ? Get(referenceHub) : null; /// /// Gets the by identifier. @@ -1247,13 +1247,13 @@ public static Player Get(string args) if (string.IsNullOrWhiteSpace(args)) return null; - if (UserIdsCache.TryGetValue(args, out Player playerFound) && playerFound?.ReferenceHub is not null) + if (UserIdsCache.TryGetValue(args, out Player playerFound) && playerFound.IsConnected) return playerFound; if (int.TryParse(args, out int id)) return Get(id); - if (args.EndsWith("@steam") || args.EndsWith("@discord") || args.EndsWith("@northwood") || args.EndsWith("@patreon")) + if (args.EndsWith("@steam") || args.EndsWith("@discord") || args.EndsWith("@northwood")) { foreach (Player player in Dictionary.Values) { @@ -1289,7 +1289,7 @@ public static Player Get(string args) } if (playerFound is not null) - UserIdsCache[args] = playerFound; + UserIdsCache[playerFound.UserId] = playerFound; return playerFound; } @@ -1315,6 +1315,14 @@ public static Player Get(string args) /// A boolean indicating whether or not a player was found. public static bool TryGet(CommandSystem.ICommandSender sender, out Player player) => (player = Get(sender)) is not null; + /// + /// Try-get a player given a . + /// + /// The . + /// The player that matches the given , or if no player is found. + /// A boolean indicating whether or not a player was found. + public static bool TryGet(Footprint footprint, out Player player) => (player = Get(footprint)) is not null; + /// /// Try-get a player given a . /// @@ -1387,6 +1395,14 @@ public static Player Get(string args) /// A boolean indicating whether or not a player was found. public static bool TryGet(PluginAPI.Core.Player apiPlayer, out Player player) => (player = Get(apiPlayer)) is not null; + /// + /// Try-get player by . + /// + /// The . + /// The player found or if not found. + /// A boolean indicating whether or not a player was found. + public static bool TryGet(Collider collider, out Player player) => (player = Get(collider)) is not null; + /// /// Adds a player's UserId to the list of reserved slots. /// @@ -1394,16 +1410,7 @@ public static Player Get(string args) /// The UserId of the player to add. /// if the slot was successfully added, or if the provided UserId already has a reserved slot. /// - public static bool AddReservedSlot(string userId) - { - if (!ReservedSlot.HasReservedSlot(userId, out _)) - { - ReservedSlot.Users.Add(userId); - return true; - } - - return false; - } + public static bool AddReservedSlot(string userId) => ReservedSlot.Users.Add(userId); /// /// Reloads the reserved slot list, clearing all reserved slot changes made with add/remove methods and reverting to the reserved slots files. @@ -1614,9 +1621,7 @@ public void TryAddCustomRoleFriendlyFire(Dictionary /// New rules for CustomeRoleFriendlyFireMultiplier to set to. public void TrySetCustomRoleFriendlyFire(Dictionary> customRoleFriendlyFireMultiplier) - { - CustomRoleFriendlyFireMultiplier = customRoleFriendlyFireMultiplier; - } + => CustomRoleFriendlyFireMultiplier = customRoleFriendlyFireMultiplier; /// /// Sets the . @@ -1643,18 +1648,17 @@ public void TrySetCustomRoleFriendlyFire(string roleTypeId, Dictionary /// Forces the player to reload their current weapon. /// - /// If the item is not a firearm. - public void ReloadWeapon() + /// if firearm was successfully reloaded. Otherwise, . + public bool ReloadWeapon() { if (CurrentItem is Firearm firearm) { - firearm.Base.AmmoManagerModule.ServerTryReload(); + bool result = firearm.Base.AmmoManagerModule.ServerTryReload(); Connection.Send(new RequestMessage(firearm.Serial, RequestType.Reload)); + return result; } - else - { - throw new InvalidOperationException("The player's CurrentItem is not a firearm."); - } + + return false; } /// @@ -1677,14 +1681,14 @@ public bool TryGetItem(ushort serial, out Item item) /// The group to be set. public void SetRank(string name, UserGroup group) { - if (ServerStatic.GetPermissionsHandler()._groups.ContainsKey(name)) + if (ServerStatic.GetPermissionsHandler()._groups.TryGetValue(name, out UserGroup userGroup)) { - ServerStatic.GetPermissionsHandler()._groups[name].BadgeColor = group.BadgeColor; - ServerStatic.GetPermissionsHandler()._groups[name].BadgeText = name; - ServerStatic.GetPermissionsHandler()._groups[name].HiddenByDefault = !group.Cover; - ServerStatic.GetPermissionsHandler()._groups[name].Cover = group.Cover; + userGroup.BadgeColor = group.BadgeColor; + userGroup.BadgeText = name; + userGroup.HiddenByDefault = !group.Cover; + userGroup.Cover = group.Cover; - ReferenceHub.serverRoles.SetGroup(ServerStatic.GetPermissionsHandler()._groups[name], false, false, group.Cover); + ReferenceHub.serverRoles.SetGroup(userGroup, false, false, group.Cover); } else { @@ -1716,10 +1720,7 @@ public void Handcuff() /// The cuffer player. public void Handcuff(Player cuffer) { - if (cuffer?.ReferenceHub == null) - return; - - if (!IsCuffed && (Vector3.Distance(Position, cuffer.Position) <= 130f)) + if (cuffer is not null && !IsCuffed && (cuffer.Position - Position).sqrMagnitude <= DisarmingHandlers.ServerDisarmingDistanceSqrt) Cuffer = cuffer; } @@ -1754,12 +1755,13 @@ public void Broadcast(Broadcast broadcast, bool shouldClearPrevious = false) /// Drops the held item. Will not do anything if the player is not holding an item. /// /// - public void DropHeldItem() + /// Dropped item's . + public Pickup DropHeldItem() { if (CurrentItem is null) - return; + return null; - DropItem(CurrentItem); + return DropItem(CurrentItem); } /// @@ -1842,6 +1844,14 @@ public bool RemoveItem(Item item, bool destroy = true) return true; } + /// + /// Removes an from the player's inventory. + /// + /// The serial to remove. + /// Whether or not to destroy the item. + /// A value indicating whether or not the was removed. + public bool RemoveItem(ushort serial, bool destroy = true) => RemoveItem(Item.Get(serial), destroy); + /// /// Removes all 's that satisfy the condition from the player's inventory. /// @@ -1974,23 +1984,26 @@ public void Heal(float amount, bool overrideMaxHealth = false) /// Forces the player to use an item. /// /// The ItemType to be used. - public void UseItem(ItemType usableItem) => UseItem(Item.Create(usableItem)); + /// if item was used successfully. Otherwise, . + public bool UseItem(ItemType usableItem) => UseItem(Item.Create(usableItem)); /// /// Forces the player to use an item. /// /// The item to be used. - /// The provided item is not a usable item. - public void UseItem(Item item) + /// if item was used successfully. Otherwise, . + public bool UseItem(Item item) { if (item is not Usable usableItem) - throw new ArgumentException($"The provided item [{item.Type}] is not a usable item.", nameof(item)); + return false; usableItem.Base.Owner = referenceHub; usableItem.Base.ServerOnUsingCompleted(); if (usableItem.Base is not null) usableItem.Destroy(); + + return true; } /// @@ -2158,7 +2171,7 @@ public void SetAmmo(AmmoType ammoType, ushort amount) => /// Whether or not ammo limits will be taken into consideration. /// if ammo was dropped; otherwise, . public bool DropAmmo(AmmoType ammoType, ushort amount, bool checkMinimals = false) => - Inventory.ServerDropAmmo(ammoType.GetItemType(), amount, checkMinimals); + Inventory.ServerDropAmmo(ammoType.GetItemType(), amount, checkMinimals).Any(); /// /// Gets the maximum amount of ammo the player can hold, given the ammo . @@ -2476,16 +2489,8 @@ public void ResetInventory(IEnumerable newItems) { ClearInventory(); - Timing.CallDelayed( - 0.5f, - () => - { - if (newItems.IsEmpty()) - return; - - foreach (ItemType item in newItems) - AddItem(item); - }); + foreach (ItemType item in newItems) + AddItem(item); } /// @@ -2496,11 +2501,8 @@ public void ResetInventory(IEnumerable newItems) { ClearInventory(); - if (newItems.Any()) - { - foreach (Item item in newItems) - AddItem(item.Base is null ? new Item(item.Type) : item); - } + foreach (Item item in newItems) + AddItem(item.Base is null ? new Item(item.Type) : item); } /// @@ -2577,7 +2579,7 @@ public void ShowHint(Hint hint) /// /// The size of the hitmarker, ranging from 0 to ). public void ShowHitMarker(float size = 1f) => - Hitmarker.SendHitmarker(Connection, size > Hitmarker.MaxSize ? Hitmarker.MaxSize : size); + Hitmarker.SendHitmarker(ReferenceHub, size); /// /// Safely gets an from , then casts it to . @@ -2886,8 +2888,8 @@ public void ChangeEffectIntensity(string effectName, byte intensity, float durat /// /// Whether or not the tantrum will apply the effect. /// If is , the tantrum is moved slightly up from its original position. Otherwise, the collision will not be detected and the slowness will not work. - /// The tantrum's . - public GameObject PlaceTantrum(bool isActive = true) => Map.PlaceTantrum(Position, isActive); + /// The instance.. + public TantrumHazard PlaceTantrum(bool isActive = true) => Map.PlaceTantrum(Position, isActive); /// /// Gives a new to the player. @@ -2936,72 +2938,80 @@ public void PlayGunSound(ItemType type, byte volume, byte audioClipId = 0) => public void Teleport(Vector3 position) => Position = position; /// - /// Teleports the player to the given object. + /// Teleports the player to the given object, with no offset. /// - /// The object to teleport the player to. + /// The object to teleport to. public void Teleport(object obj) + => Teleport(obj, Vector3.zero); + + /// + /// Teleports the player to the given object, offset by the defined offset value. + /// + /// The object to teleport the player to. + /// The offset to teleport. + public void Teleport(object obj, Vector3 offset) { switch (obj) { case TeslaGate teslaGate: Teleport( - teslaGate.Position + Vector3.up + + teslaGate.Position + offset + Vector3.up + (teslaGate.Room.Transform.rotation == new Quaternion(0f, 0f, 0f, 1f) ? new Vector3(3, 0, 0) : new Vector3(0, 0, 3))); break; case IPosition positionObject: - Teleport(positionObject.Position + Vector3.up); + Teleport(positionObject.Position + Vector3.up + offset); break; case DoorType doorType: - Teleport(Door.Get(doorType).Position + Vector3.up); + Teleport(Door.Get(doorType).Position + Vector3.up + offset); break; case SpawnLocationType sp: - Teleport(sp.GetPosition()); + Teleport(sp.GetPosition() + offset); break; case RoomType roomType: - Teleport(Room.Get(roomType).Position + Vector3.up); + Teleport(Room.Get(roomType).Position + Vector3.up + offset); break; case Enums.CameraType cameraType: - Teleport(Camera.Get(cameraType).Position); + Teleport(Camera.Get(cameraType).Position + offset); break; case ElevatorType elevatorType: - Teleport(Lift.Get(elevatorType).Position + Vector3.up); + Teleport(Lift.Get(elevatorType).Position + Vector3.up + offset); break; case Scp914Controller scp914: - Teleport(scp914._knobTransform.position + Vector3.up); + Teleport(scp914._knobTransform.position + Vector3.up + offset); break; case Role role: if (role.Owner is not null) - Teleport(role.Owner.Position); + Teleport(role.Owner.Position + offset); else Log.Warn($"{nameof(Teleport)}: {Assembly.GetCallingAssembly().GetName().Name}: Invalid role teleport (role is missing Owner)."); break; case Locker locker: - Teleport(locker.transform.position + Vector3.up); + Teleport(locker.transform.position + Vector3.up + offset); break; case LockerChamber chamber: - Teleport(chamber._spawnpoint.position + Vector3.up); + Teleport(chamber._spawnpoint.position + Vector3.up + offset); break; case ElevatorChamber elevator: - Teleport(elevator.transform.position + Vector3.up); + Teleport(elevator.transform.position + Vector3.up + offset); break; case Item item: if (item.Owner is not null) - Teleport(item.Owner.Position); + Teleport(item.Owner.Position + offset); else Log.Warn($"{nameof(Teleport)}: {Assembly.GetCallingAssembly().GetName().Name}: Invalid item teleport (item is missing Owner)."); break; // Unity case Vector3 v3: // I wouldn't be surprised if someone calls this method with a Vector3. - Teleport(v3); + Teleport(v3 + offset); break; case Component comp: - Teleport(comp.transform.position + Vector3.up); + Teleport(comp.transform.position + Vector3.up + offset); break; case GameObject go: - Teleport(go.transform.position + Vector3.up); + Teleport(go.transform.position + Vector3.up + offset); break; default: @@ -3142,14 +3152,40 @@ public bool HasComponent(Type type, bool depthInheritance = false) => depthInher ? componentsInChildren.Any(comp => type.IsSubclassOf(comp.GetType())) : componentsInChildren.Any(comp => type == comp.GetType()); + /// + /// Get the time cooldown on this ItemType. + /// + /// The itemtypes to choose for getting cooldown. + /// Return the time in seconds of the cooldowns. + public float GetCooldownItem(ItemType itemType) + => UsableItemsController.GetHandler(ReferenceHub).PersonalCooldowns.TryGetValue(itemType, out float value) ? value : -1; + /// /// Set the time cooldown on this ItemType. /// /// The times for the cooldown. /// The itemtypes to choose for being cooldown. - public void GetCooldownItem(float time, ItemType itemType) + public void SetCooldownItem(float time, ItemType itemType) => UsableItemsController.GetHandler(ReferenceHub).PersonalCooldowns[itemType] = Time.timeSinceLevelLoad + time; + /// + /// Explode the player. + /// + public void Explode() => ExplosionUtils.ServerExplode(ReferenceHub); + + /// + /// Explode the player. + /// + /// The projectile that will create the explosion. + /// The Player that will causing the explosion. + public void Explode(ProjectileType projectileType, Player attacker = null) => Map.Explode(Position, projectileType, attacker); + + /// + /// Spawn projectile effect on the player. + /// + /// The projectile that will create the effect. + public void ExplodeEffect(ProjectileType projectileType) => Map.ExplodeEffect(Position, projectileType); + /// /// Converts the player in a human-readable format. /// diff --git a/Exiled.API/Features/Plugin.cs b/Exiled.API/Features/Plugin.cs index 1c0d09fb72..0c4b23fd2b 100644 --- a/Exiled.API/Features/Plugin.cs +++ b/Exiled.API/Features/Plugin.cs @@ -13,13 +13,9 @@ namespace Exiled.API.Features using System.Reflection; using CommandSystem; - using Enums; - using Extensions; - using Interfaces; - using RemoteAdmin; /// @@ -124,12 +120,26 @@ public virtual void OnRegisteringCommands() if (!typeCommands.TryGetValue(type, out ICommand command)) command = (ICommand)Activator.CreateInstance(type); - if (commandType == typeof(RemoteAdminCommandHandler)) - CommandProcessor.RemoteAdminCommandHandler.RegisterCommand(command); - else if (commandType == typeof(GameConsoleCommandHandler)) - GameCore.Console.singleton.ConsoleCommandHandler.RegisterCommand(command); - else if (commandType == typeof(ClientCommandHandler)) - QueryProcessor.DotCommandHandler.RegisterCommand(command); + try + { + if (commandType == typeof(RemoteAdminCommandHandler)) + CommandProcessor.RemoteAdminCommandHandler.RegisterCommand(command); + else if (commandType == typeof(GameConsoleCommandHandler)) + GameCore.Console.singleton.ConsoleCommandHandler.RegisterCommand(command); + else if (commandType == typeof(ClientCommandHandler)) + QueryProcessor.DotCommandHandler.RegisterCommand(command); + } + catch (ArgumentException e) + { + if (e.Message.StartsWith("An")) + { + Log.Error($"Command with same name has already registered! Command: {command.Command}"); + } + else + { + Log.Error($"An error has occurred while registering a command: {e}"); + } + } Commands[commandType][type] = command; } diff --git a/Exiled.API/Features/Ragdoll.cs b/Exiled.API/Features/Ragdoll.cs index 8302c9de14..47c3e10dc2 100644 --- a/Exiled.API/Features/Ragdoll.cs +++ b/Exiled.API/Features/Ragdoll.cs @@ -53,21 +53,21 @@ internal Ragdoll(BasicRagdoll ragdoll) /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => BasicRagdollToRagdoll.Values; + public static IReadOnlyCollection List => BasicRagdollToRagdoll.Values; /// /// Gets or sets the s clean up time. /// - public static int CleanUpTime + public static int FreezeTime { - get => RagdollManager.CleanupTime; - set => RagdollManager.CleanupTime = value; + get => RagdollManager.FreezeTime; + set => RagdollManager.FreezeTime = value; } /// /// Gets a value indicating whether or not the clean up event can be executed. /// - public bool AllowCleanUp => NetworkInfo.ExistenceTime < CleanUpTime; + public bool AllowCleanUp => NetworkInfo.ExistenceTime < FreezeTime; /// /// Gets the instance of the ragdoll. @@ -94,9 +94,13 @@ public RagdollData NetworkInfo } /// - /// Gets the ragdoll's . + /// Gets or sets the ragdoll's . /// - public DamageHandlerBase DamageHandler => NetworkInfo.Handler; + public DamageHandlerBase DamageHandler + { + get => NetworkInfo.Handler; + set => NetworkInfo = new(NetworkInfo.OwnerHub, value, NetworkInfo.RoleType, NetworkInfo.StartPosition, NetworkInfo.StartRotation, NetworkInfo.Nickname, NetworkInfo.CreationTime); + } /// /// Gets the ragdoll's []. @@ -111,7 +115,7 @@ public RagdollData NetworkInfo /// /// Gets a value indicating whether or not the ragdoll has been already cleaned up. /// - public bool IsCleanedUp => Base._cleanedUp; + public bool IsFrozen => Base._frozen; /// /// Gets or sets a value indicating whether or not the ragdoll can be cleaned up. @@ -134,22 +138,53 @@ public bool CanBeCleanedUp public string Name => Base.name; /// - /// Gets the owner . Can be if the ragdoll does not have an owner. + /// Gets or sets the ragdoll's nickname. /// - public Player Owner => Player.Get(NetworkInfo.OwnerHub); + public string Nickname + { + get => NetworkInfo.Nickname; + set => NetworkInfo = new(NetworkInfo.OwnerHub, NetworkInfo.Handler, NetworkInfo.RoleType, NetworkInfo.StartPosition, NetworkInfo.StartRotation, value, NetworkInfo.CreationTime); + } /// - /// Gets the time that the ragdoll was spawned. + /// Gets the ragdoll's existence time. /// - public DateTime CreationTime => new((long)NetworkInfo.CreationTime); + public float ExistenceTime => NetworkInfo.ExistenceTime; /// - /// Gets the of the ragdoll. + /// Gets or sets the owner . Can be if the ragdoll does not have an owner. /// - public RoleTypeId Role => NetworkInfo.RoleType; + public Player Owner + { + get => Player.Get(NetworkInfo.OwnerHub); + set => NetworkInfo = new(value.ReferenceHub, NetworkInfo.Handler, NetworkInfo.RoleType, NetworkInfo.StartPosition, NetworkInfo.StartRotation, NetworkInfo.Nickname, NetworkInfo.CreationTime); + } /// - /// Gets a value indicating whether or not the ragdoll has expired and SCP-049 is unable to revive it. + /// Gets or sets the time that the ragdoll was spawned. + /// + public DateTime CreationTime + { + get => DateTime.Now - TimeSpan.FromSeconds(NetworkInfo.ExistenceTime); + set + { + float creationTime = (float)(NetworkTime.time - (DateTime.Now - value).TotalSeconds); + NetworkInfo = new RagdollData(NetworkInfo.OwnerHub, NetworkInfo.Handler, NetworkInfo.RoleType, NetworkInfo.StartPosition, NetworkInfo.StartRotation, NetworkInfo.Nickname, creationTime); + } + } + + /// + /// Gets or sets the of the ragdoll. + /// + public RoleTypeId Role + { + get => NetworkInfo.RoleType; + set => NetworkInfo = new(NetworkInfo.OwnerHub, NetworkInfo.Handler, value, NetworkInfo.StartPosition, NetworkInfo.StartRotation, NetworkInfo.Nickname, NetworkInfo.CreationTime); + } + + /// + /// Gets a value indicating whether or not the ragdoll has expired and SCP-049 is unable to revive it if was not being targets. + /// /// public bool IsExpired => NetworkInfo.ExistenceTime > PlayerRoles.PlayableScps.Scp049.Scp049ResurrectAbility.HumanCorpseDuration; @@ -236,30 +271,39 @@ public Vector3 Scale /// internal static HashSet IgnoredRagdolls { get; set; } = new(); + /// + /// Gets the last ragdoll of the player. + /// + /// The player to get the last ragdoll. + /// The Last Ragdoll. + public static Ragdoll GetLast(Player player) => Get(player).LastOrDefault(); + /// /// Creates a new ragdoll. /// /// The data associated with the ragdoll. - /// The ragdoll. - /// Provided RoleType is not a valid ragdoll role (Spectator, Scp079, etc). - /// Unable to create a ragdoll. - public static Ragdoll Create(RagdollData networkInfo) + /// Created ragdoll. Will be if method retunred . + /// if ragdoll was successfully created. Otherwise, false. + public static bool TryCreate(RagdollData networkInfo, out Ragdoll ragdoll) { + ragdoll = null; + if (networkInfo.RoleType.GetRoleBase() is not IRagdollRole ragdollRole) - throw new ArgumentException($"Provided RoleType '{networkInfo.RoleType}' is not a valid ragdoll role."); + return false; GameObject modelRagdoll = ragdollRole.Ragdoll.gameObject; - if (modelRagdoll == null || !Object.Instantiate(modelRagdoll).TryGetComponent(out BasicRagdoll ragdoll)) - throw new InvalidOperationException($"Unable to create a ragdoll of type {networkInfo.RoleType}."); + if (modelRagdoll == null || !Object.Instantiate(modelRagdoll).TryGetComponent(out BasicRagdoll basicRagdoll)) + return false; - ragdoll.NetworkInfo = networkInfo; + basicRagdoll.NetworkInfo = networkInfo; - return new(ragdoll) + ragdoll = new(basicRagdoll) { Position = networkInfo.StartPosition, Rotation = networkInfo.StartRotation, }; + return true; } /// @@ -268,10 +312,11 @@ public static Ragdoll Create(RagdollData networkInfo) /// The of the ragdoll. /// The name of the ragdoll. /// The damage handler responsible for the ragdoll's death. + /// Created ragdoll. Will be if method retunred . /// The optional owner of the ragdoll. /// The ragdoll. - public static Ragdoll Create(RoleTypeId roleType, string name, DamageHandlerBase damageHandler, Player owner = null) - => Create(new(owner?.ReferenceHub ?? Server.Host.ReferenceHub, damageHandler, roleType, default, default, name, NetworkTime.time)); + public static bool TryCreate(RoleTypeId roleType, string name, DamageHandlerBase damageHandler, out Ragdoll ragdoll, Player owner = null) + => TryCreate(new(owner?.ReferenceHub ?? Server.Host.ReferenceHub, damageHandler, roleType, default, default, name, NetworkTime.time), out ragdoll); /// /// Creates a new ragdoll. @@ -279,10 +324,11 @@ public static Ragdoll Create(RoleTypeId roleType, string name, DamageHandlerBase /// The of the ragdoll. /// The name of the ragdoll. /// The reason the ragdoll died. + /// Created ragdoll. Will be if method retunred . /// The optional owner of the ragdoll. /// The ragdoll. - public static Ragdoll Create(RoleTypeId roleType, string name, string deathReason, Player owner = null) - => Create(roleType, name, new CustomReasonDamageHandler(deathReason), owner); + public static bool TryCreate(RoleTypeId roleType, string name, string deathReason, out Ragdoll ragdoll, Player owner = null) + => TryCreate(roleType: roleType, name: name, damageHandler: new CustomReasonDamageHandler(deathReason), out ragdoll, owner); /// /// Creates and spawns a new ragdoll. @@ -291,7 +337,9 @@ public static Ragdoll Create(RoleTypeId roleType, string name, string deathReaso /// The ragdoll. public static Ragdoll CreateAndSpawn(RagdollData networkInfo) { - Ragdoll doll = Create(networkInfo); + if (!TryCreate(networkInfo, out Ragdoll doll)) + return null; + doll.Spawn(); return doll; @@ -328,16 +376,15 @@ public static Ragdoll CreateAndSpawn(RoleTypeId roleType, string name, string de /// /// The to get. /// A or if not found. - public static Ragdoll Get(BasicRagdoll ragdoll) => BasicRagdollToRagdoll.TryGetValue(ragdoll, out Ragdoll doll) - ? doll - : new Ragdoll(ragdoll); + public static Ragdoll Get(BasicRagdoll ragdoll) => ragdoll == null ? null : + BasicRagdollToRagdoll.TryGetValue(ragdoll, out Ragdoll doll) ? doll : new Ragdoll(ragdoll); /// /// Gets the of belonging to the , if any. /// /// The to get. /// A of . - public static IEnumerable Get(Player player) => Ragdoll.List.Where(rd => rd.Owner == player); + public static IEnumerable Get(Player player) => List.Where(rd => rd.Owner == player); /// /// Gets the of belonging to the of , if any. @@ -367,4 +414,4 @@ public static Ragdoll Get(BasicRagdoll ragdoll) => BasicRagdollToRagdoll.TryGetV /// A string containing Ragdoll-related data. public override string ToString() => $"{Owner} ({Name}) [{DeathReason}] *{Role}* |{CreationTime}| ={IsExpired}="; } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Recontainer.cs b/Exiled.API/Features/Recontainer.cs index 681e56cd96..0512c7c764 100644 --- a/Exiled.API/Features/Recontainer.cs +++ b/Exiled.API/Features/Recontainer.cs @@ -11,9 +11,8 @@ namespace Exiled.API.Features using System.Linq; using Enums; - + using Exiled.API.Features.Doors; using PlayerRoles.PlayableScps.Scp079; - using UnityEngine; /// @@ -39,7 +38,7 @@ public static class Recontainer /// /// Gets or sets a value indicating whether the containment zone is open. /// - public static bool IsContaimentZoneOpen + public static bool IsContainmentZoneOpen { get => ContainmentGates.All(door => door.IsOpen); set => Base.SetContainmentDoors(value, IsContainmentZoneLocked); @@ -51,7 +50,7 @@ public static bool IsContaimentZoneOpen public static bool IsContainmentZoneLocked { get => ContainmentGates.All(door => door.IsLocked); - set => Base.SetContainmentDoors(IsContaimentZoneOpen, value); + set => Base.SetContainmentDoors(IsContainmentZoneOpen, value); } /// @@ -171,7 +170,7 @@ public static bool IsContainmentSequenceSuccessful /// /// Gets a of which contains all the instances locked during the overcharge procedure. /// - public static IEnumerable LockedDoors => Door.Get(door => Base._lockedDoors.Contains(door.Base)); + public static IEnumerable LockedDoors => Base._lockedDoors.Select(Door.Get); /// /// Tries to kill SCP-079. diff --git a/Exiled.API/Features/Respawn.cs b/Exiled.API/Features/Respawn.cs index 81d6198403..46911300dd 100644 --- a/Exiled.API/Features/Respawn.cs +++ b/Exiled.API/Features/Respawn.cs @@ -144,10 +144,7 @@ public static bool ProtectedCanShoot public static void PlayEffects(byte[] effects) { foreach (RespawnEffectsController controller in RespawnEffectsController.AllControllers) - { - if (controller != null) - controller.RpcPlayEffects(effects); - } + controller?.RpcPlayEffects(effects); } /// diff --git a/Exiled.API/Features/Roles/FilmMakerRole.cs b/Exiled.API/Features/Roles/FilmMakerRole.cs new file mode 100644 index 0000000000..5dcd39f352 --- /dev/null +++ b/Exiled.API/Features/Roles/FilmMakerRole.cs @@ -0,0 +1,47 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Features.Roles +{ + using PlayerRoles; + using UnityEngine; + + using FilmmakerGameRole = PlayerRoles.Filmmaker.FilmmakerRole; + + /// + /// Represents the base-game FilmMaker role. + /// + public class FilmMakerRole : Role + { + /// + /// Initializes a new instance of the class. + /// + /// the base . + internal FilmMakerRole(FilmmakerGameRole filmmakerRole) + : base(filmmakerRole) + { + Base = filmmakerRole; + } + + /// + public override RoleTypeId Type { get; } = RoleTypeId.Filmmaker; + + /// + /// Gets or sets the filmmaker's camera rotation. + /// + public Quaternion CameraRotation + { + get => Base.CameraRotation; + set => Base.CameraRotation = value; + } + + /// + /// Gets the base . + /// + public new FilmmakerGameRole Base { get; } + } +} \ No newline at end of file diff --git a/Exiled.API/Features/Roles/FpcRole.cs b/Exiled.API/Features/Roles/FpcRole.cs index f69ee7c68b..ee09826504 100644 --- a/Exiled.API/Features/Roles/FpcRole.cs +++ b/Exiled.API/Features/Roles/FpcRole.cs @@ -17,6 +17,8 @@ namespace Exiled.API.Features.Roles using PlayerStatsSystem; using RelativePositioning; + using UnityEngine; + /// /// Defines a role that represents an fpc class. /// @@ -51,6 +53,15 @@ public RelativePosition RelativePosition set => FirstPersonController.FpcModule.Motor.ReceivedPosition = value; } + /// + /// Gets or sets a value indicating whether if a rotation is detected on the player. + /// + public bool RotationDetected + { + get => FirstPersonController.FpcModule.Motor.RotationDetected; + set => FirstPersonController.FpcModule.Motor.RotationDetected = value; + } + /// /// Gets or sets the walking speed. /// @@ -87,6 +98,24 @@ public float CrouchingSpeed set => FirstPersonController.FpcModule.CrouchSpeed = value; } + /// + /// Gets or sets the velocity. + /// + public Vector3 Velocity + { + get => FirstPersonController.FpcModule.Motor.Velocity; + set => FirstPersonController.FpcModule.Motor.Velocity = value; + } + + /// + /// Gets or sets a value indicating whether if a movement is detected on a . + /// + public bool MovementDetected + { + get => FirstPersonController.FpcModule.Motor.MovementDetected; + set => FirstPersonController.FpcModule.Motor.MovementDetected = value; + } + /// /// Gets a value indicating whether or not the player can send inputs. /// @@ -131,6 +160,21 @@ public PlayerMovementState MoveState /// public bool IsInDarkness => FirstPersonController.InDarkness; + /// + /// Gets the 's vertical rotation. + /// + public float VerticalRotation => FirstPersonController.VerticalRotation; + + /// + /// Gets the 's horizontal rotation. + /// + public float HorizontalRotation => FirstPersonController.HorizontalRotation; + + /// + /// Gets a value indicating whether or not the is AFK. + /// + public bool IsAfk => FirstPersonController.IsAFK; + /// /// Gets a value indicating whether or not this role is protected by a hume shield. /// diff --git a/Exiled.API/Features/Roles/HumanRole.cs b/Exiled.API/Features/Roles/HumanRole.cs index 35a324c0fd..4d9888723f 100644 --- a/Exiled.API/Features/Roles/HumanRole.cs +++ b/Exiled.API/Features/Roles/HumanRole.cs @@ -25,50 +25,50 @@ public class HumanRole : FpcRole internal HumanRole(HumanGameRole baseRole) : base(baseRole) { - Internal = baseRole; + Base = baseRole; } /// - public override RoleTypeId Type => Internal.RoleTypeId; + public override RoleTypeId Type => Base.RoleTypeId; /// /// Gets or sets the . /// public SpawnableTeamType SpawnableTeamType { - get => Internal.AssignedSpawnableTeam; - set => Internal.AssignedSpawnableTeam = value; + get => Base.AssignedSpawnableTeam; + set => Base.AssignedSpawnableTeam = value; } /// /// Gets the . /// - public string UnitName => Internal.UnitName; + public string UnitName => Base.UnitName; /// /// Gets or sets the . /// public byte UnitNameId { - get => Internal.UnitNameId; - set => Internal.UnitNameId = value; + get => Base.UnitNameId; + set => Base.UnitNameId = value; } /// /// Gets a value indicating whether the uses unit names or not. /// - public bool UsesUnitNames => Internal.UsesUnitNames; + public bool UsesUnitNames => Base.UsesUnitNames; /// /// Gets the game . /// - protected HumanGameRole Internal { get; } + public new HumanGameRole Base { get; } /// /// Gets the armor efficacy based on a specific and the armor the is wearing. /// /// The . /// The armor efficacy. - public int GetArmorEfficacy(HitboxType hitbox) => Internal.GetArmorEfficacy(hitbox); + public int GetArmorEfficacy(HitboxType hitbox) => Base.GetArmorEfficacy(hitbox); } } \ No newline at end of file diff --git a/Exiled.API/Features/Roles/OverwatchRole.cs b/Exiled.API/Features/Roles/OverwatchRole.cs index ee0a0257ae..e9a5261e65 100644 --- a/Exiled.API/Features/Roles/OverwatchRole.cs +++ b/Exiled.API/Features/Roles/OverwatchRole.cs @@ -23,9 +23,21 @@ public class OverwatchRole : SpectatorRole internal OverwatchRole(OverwatchGameRole baseRole) : base(baseRole) { + Base = baseRole; } /// public override RoleTypeId Type => RoleTypeId.Overwatch; + + /// + /// Gets the game . + /// + public new OverwatchGameRole Base { get; } + + /// + /// Gets the Overwatch role for a player. + /// + /// The overwatch RoleType. + public RoleTypeId GetObfuscatedRole() => Base.GetRoleForUser(Owner.ReferenceHub); } } diff --git a/Exiled.API/Features/Roles/Role.cs b/Exiled.API/Features/Roles/Role.cs index 0c328d5467..ca6a3f823c 100644 --- a/Exiled.API/Features/Roles/Role.cs +++ b/Exiled.API/Features/Roles/Role.cs @@ -21,6 +21,7 @@ namespace Exiled.API.Features.Roles using UnityEngine; + using FilmmakerGameRole = PlayerRoles.Filmmaker.FilmmakerRole; using HumanGameRole = PlayerRoles.HumanRole; using OverwatchGameRole = PlayerRoles.Spectating.OverwatchRole; using Scp049GameRole = PlayerRoles.PlayableScps.Scp049.Scp049Role; @@ -225,6 +226,7 @@ public virtual void Set(RoleTypeId newRole, SpawnReason reason, RoleSpawnFlags s OverwatchGameRole overwatchRole => new OverwatchRole(overwatchRole), SpectatorGameRole spectatorRole => new SpectatorRole(spectatorRole), HumanGameRole humanRole => new HumanRole(humanRole), + FilmmakerGameRole filmmakerRole => new FilmMakerRole(filmmakerRole), _ => new NoneRole(role), }; } diff --git a/Exiled.API/Features/Roles/Scp0492Role.cs b/Exiled.API/Features/Roles/Scp0492Role.cs index 6b8913e60f..2ffb064c30 100644 --- a/Exiled.API/Features/Roles/Scp0492Role.cs +++ b/Exiled.API/Features/Roles/Scp0492Role.cs @@ -42,8 +42,6 @@ internal Scp0492Role(ZombieRole baseRole) Log.Error("ZombieConsumeAbility subroutine not found in Scp0492Role::ctor"); ConsumeAbility = zombieConsumeAbility492; - - AttackDamage = AttackAbility.DamageAmount; } /// @@ -80,10 +78,9 @@ public int ResurrectNumber } /// - /// Gets or sets the SCP-049-2 attack damage. + /// Gets the SCP-049-2 attack damage. /// - /// Setter will work later //TODO. - public float AttackDamage { get; set; } + public float AttackDamage => AttackAbility.DamageAmount; /// /// Gets or sets a value indicating the amount of time to simulate SCP-049-2's Bloodlust ability. @@ -120,7 +117,7 @@ public float SimulatedStare /// This method only returns whether or not SCP-049-2 is close enough to the body to consume it; the body may have been consumed previously. Make sure to check to ensure the body can be consumed. /// The ragdoll to check. /// if close enough to consume the body; otherwise, . - public bool IsInConsumeRange(BasicRagdoll ragdoll) => ConsumeAbility.IsCloseEnough(Owner.Position, ragdoll.transform.position); + public bool IsInConsumeRange(BasicRagdoll ragdoll) => ragdoll != null && ConsumeAbility.IsCloseEnough(Owner.Position, ragdoll.transform.position); /// /// Returns a indicating whether or not SCP-049-2 is close enough to a ragdoll to consume it. @@ -128,6 +125,6 @@ public float SimulatedStare /// This method only returns whether or not SCP-049-2 is close enough to the body to consume it; the body may have been consumed previously. Make sure to check to ensure the body can be consumed. /// The ragdoll to check. /// if close enough to consume the body; otherwise, . - public bool IsInConsumeRange(Ragdoll ragdoll) => IsInConsumeRange(ragdoll.Base); + public bool IsInConsumeRange(Ragdoll ragdoll) => ragdoll is not null && IsInConsumeRange(ragdoll.Base); } } \ No newline at end of file diff --git a/Exiled.API/Features/Roles/Scp049Role.cs b/Exiled.API/Features/Roles/Scp049Role.cs index 3ddba0d08a..bc4f7e0c87 100644 --- a/Exiled.API/Features/Roles/Scp049Role.cs +++ b/Exiled.API/Features/Roles/Scp049Role.cs @@ -7,10 +7,19 @@ namespace Exiled.API.Features.Roles { + using System.Collections.Generic; + using System.Linq; + + using CustomPlayerEffects; + using PlayerRoles; + using PlayerRoles.PlayableScps; using PlayerRoles.PlayableScps.HumeShield; using PlayerRoles.PlayableScps.Scp049; using PlayerRoles.PlayableScps.Subroutines; + using PlayerStatsSystem; + + using UnityEngine; using Scp049GameRole = PlayerRoles.PlayableScps.Scp049.Scp049Role; @@ -26,6 +35,7 @@ public class Scp049Role : FpcRole, ISubroutinedScpRole, IHumeShieldRole internal Scp049Role(Scp049GameRole baseRole) : base(baseRole) { + Base = baseRole; SubroutineModule = baseRole.SubroutineModule; HumeShieldModule = baseRole.HumeShieldModule; @@ -43,8 +53,18 @@ internal Scp049Role(Scp049GameRole baseRole) Log.Error("Scp049SenseAbility subroutine not found in Scp049Role::ctor"); SenseAbility = scp049SenseAbility; + + if (!SubroutineModule.TryGetSubroutine(out Scp049AttackAbility scp049AttackAbility)) + Log.Error("Scp049AttackAbility subroutine not found in Scp049Role::ctor"); + + AttackAbility = scp049AttackAbility; } + /// + /// Gets a list of players who will be turned away from SCP-049 Sense Ability. + /// + public static HashSet TurnedPlayers { get; } = new(20); + /// public override RoleTypeId Type { get; } = RoleTypeId.Scp049; @@ -59,6 +79,11 @@ internal Scp049Role(Scp049GameRole baseRole) /// public Scp049ResurrectAbility ResurrectAbility { get; } + /// + /// Gets SCP-049's . + /// + public Scp049AttackAbility AttackAbility { get; } + /// /// Gets SCP-049's . /// @@ -89,6 +114,16 @@ internal Scp049Role(Scp049GameRole baseRole) /// public Ragdoll RecallingRagdoll => Ragdoll.Get(ResurrectAbility.CurRagdoll); + /// + /// Gets all the dead zombies. + /// + public IEnumerable DeadZombies => Scp049ResurrectAbility.DeadZombies.Select(x => Player.Get(x)); + + /// + /// Gets all the resurrected players. + /// + public Dictionary ResurrectedPlayers => Scp049ResurrectAbility.ResurrectedPlayers.ToDictionary(x => Player.Get(x.Key), x => x.Value); + /// /// Gets or sets the amount of time before SCP-049 can use its Doctor's Call ability again. /// @@ -115,19 +150,186 @@ public float GoodSenseCooldown } } + /// + /// Gets or sets the amount of time before SCP-049 can attack again. + /// + public float RemainingAttackCooldown + { + get => AttackAbility.Cooldown.Remaining; + set + { + AttackAbility.Cooldown.Remaining = value; + AttackAbility.ServerSendRpc(true); + } + } + + /// + /// Gets or sets the duration of the . + /// + public float RemainingCallDuration + { + get => CallAbility.Duration.Remaining; + set + { + CallAbility.Duration.Remaining = value; + CallAbility.ServerSendRpc(true); + } + } + + /// + /// Gets or sets the duration of the . + /// + public float RemainingGoodSenseDuration + { + get => SenseAbility.Duration.Remaining; + set + { + SenseAbility.Duration.Remaining = value; + SenseAbility.ServerSendRpc(true); + } + } + + /// + /// Gets or sets the distance of the Sense Ability. + /// + public float SenseDistance + { + get => SenseAbility._distanceThreshold; + set => SenseAbility._distanceThreshold = value; + } + + /// + /// Gets the instance. + /// + public new Scp049GameRole Base { get; } + + /// + /// Lose the current target of the Good Sense ability. + /// + public void LoseSenseTarget() => SenseAbility.ServerLoseTarget(); + + /// + /// Resurrects a . + /// + /// The to resurrect. + /// The Resurrected player. + public bool Resurrect(Player player) + { + if (player is null) + return false; + player.ReferenceHub.transform.position = ResurrectAbility.ScpRole.FpcModule.Position; + + HumeShieldModuleBase humeShield = ResurrectAbility.ScpRole.HumeShieldModule; + humeShield.HsCurrent = Mathf.Min(humeShield.HsCurrent + 100f, humeShield.HsMax); + + return Resurrect(Ragdoll.GetLast(player)); + } + + /// + /// Resurrects a owner. + /// + /// The Ragdoll to resurrect. + /// The Resurrected Ragdoll. + public bool Resurrect(Ragdoll ragdoll) + { + if (ragdoll is null) + return false; + + ResurrectAbility.CurRagdoll = ragdoll.Base; + ResurrectAbility.ServerComplete(); + + return true; + } + + /// + /// Attacks a Player. + /// + /// The to attack. + public void Attack(Player player) + { + AttackAbility._target = player?.ReferenceHub; + + if (AttackAbility._target is null || !AttackAbility.IsTargetValid(AttackAbility._target)) + return; + + AttackAbility.Cooldown.Trigger(Scp049AttackAbility.CooldownTime); + CardiacArrest cardiacArrest = AttackAbility._target.playerEffectsController.GetEffect(); + + if (cardiacArrest.IsEnabled) + { + AttackAbility._target.playerStats.DealDamage(new Scp049DamageHandler(AttackAbility.Owner, StandardDamageHandler.KillValue, Scp049DamageHandler.AttackType.Instakill)); + } + else + { + cardiacArrest.SetAttacker(AttackAbility.Owner); + cardiacArrest.Intensity = 1; + cardiacArrest.ServerChangeDuration(AttackAbility._statusEffectDuration, false); + } + + SenseAbility.OnServerHit(AttackAbility._target); + + AttackAbility.ServerSendRpc(true); + Hitmarker.SendHitmarker(AttackAbility.Owner, 1f); + } + + /// + /// Trigger the Sense Ability on the specified . + /// + /// The Player to sense. + public void Sense(Player player) + { + if (!SenseAbility.Cooldown.IsReady || !SenseAbility.Duration.IsReady) + return; + + SenseAbility.HasTarget = false; + SenseAbility.Target = player?.ReferenceHub; + + if (SenseAbility.Target is null) + { + SenseAbility.Cooldown.Trigger(Scp049SenseAbility.AttemptFailCooldown); + SenseAbility.ServerSendRpc(true); + return; + } + else + { + if (SenseAbility.Target.roleManager.CurrentRole is not PlayerRoles.HumanRole humanRole) + return; + + float radius = humanRole.FpcModule.CharController.radius; + if (!VisionInformation.GetVisionInformation(SenseAbility.Owner, SenseAbility.Owner.PlayerCameraReference, humanRole.CameraPosition, radius, SenseAbility._distanceThreshold).IsLooking) + return; + + SenseAbility.Duration.Trigger(Scp049SenseAbility.ReducedCooldown); + SenseAbility.HasTarget = true; + SenseAbility.ServerSendRpc(true); + } + } + + /// + /// Refresh the duration. + /// + public void RefreshCallDuration() => CallAbility.ServerRefreshDuration(); + + /// + /// Gets the amount of resurrections of a . + /// + /// The to check. + /// The amount of resurrections of the checked player. + public int GetResurrectionCount(Player player) => player is not null ? Scp049ResurrectAbility.GetResurrectionsNumber(player.ReferenceHub) : 0; + /// /// Returns a indicating whether or not the ragdoll can be resurrected by SCP-049. /// /// The ragdoll to check. /// if the body can be revived; otherwise, . - public bool CanResurrect(BasicRagdoll ragdoll) => ResurrectAbility.CheckRagdoll(ragdoll); + public bool CanResurrect(BasicRagdoll ragdoll) => ragdoll != null && ResurrectAbility.CheckRagdoll(ragdoll); /// /// Returns a indicating whether or not the ragdoll can be resurrected by SCP-049. /// /// The ragdoll to check. /// if the body can be revived; otherwise, . - public bool CanResurrect(Ragdoll ragdoll) => ResurrectAbility.CheckRagdoll(ragdoll.Base); + public bool CanResurrect(Ragdoll ragdoll) => ragdoll is not null && ResurrectAbility.CheckRagdoll(ragdoll.Base); /// /// Returns a indicating whether or not SCP-049 is close enough to a ragdoll to revive it. @@ -135,7 +337,7 @@ public float GoodSenseCooldown /// This method only returns whether or not SCP-049 is close enough to the body to revive it; the body may have expired. Make sure to check to ensure the body can be revived. /// The ragdoll to check. /// if close enough to revive the body; otherwise, . - public bool IsInRecallRange(BasicRagdoll ragdoll) => ResurrectAbility.IsCloseEnough(Owner.Position, ragdoll.transform.position); + public bool IsInRecallRange(BasicRagdoll ragdoll) => ragdoll != null && ResurrectAbility.IsCloseEnough(Owner.Position, ragdoll.transform.position); /// /// Returns a indicating whether or not SCP-049 is close enough to a ragdoll to revive it. @@ -143,6 +345,13 @@ public float GoodSenseCooldown /// This method only returns whether or not SCP-049 is close enough to the body to revive it; the body may have expired. Make sure to check to ensure the body can be revived. /// The ragdoll to check. /// if close enough to revive the body; otherwise, . - public bool IsInRecallRange(Ragdoll ragdoll) => IsInRecallRange(ragdoll.Base); + public bool IsInRecallRange(Ragdoll ragdoll) => ragdoll is not null && IsInRecallRange(ragdoll.Base); + + /// + /// Gets the Spawn Chance of SCP-049. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Roles/Scp079Role.cs b/Exiled.API/Features/Roles/Scp079Role.cs index cc0a6a814f..bdfe81d5c8 100644 --- a/Exiled.API/Features/Roles/Scp079Role.cs +++ b/Exiled.API/Features/Roles/Scp079Role.cs @@ -11,15 +11,22 @@ namespace Exiled.API.Features.Roles using System.Linq; using Exiled.API.Enums; + using Exiled.API.Features.Doors; using Interactables.Interobjects.DoorUtils; + using MapGeneration; + using Mirror; using PlayerRoles; using PlayerRoles.PlayableScps.Scp079; using PlayerRoles.PlayableScps.Scp079.Cameras; + using PlayerRoles.PlayableScps.Scp079.Pinging; using PlayerRoles.PlayableScps.Scp079.Rewards; using PlayerRoles.PlayableScps.Subroutines; + using RelativePositioning; + using Utils.NonAllocLINQ; using Mathf = UnityEngine.Mathf; using Scp079GameRole = PlayerRoles.PlayableScps.Scp079.Scp079Role; + using Vector3 = UnityEngine.Vector3; /// /// Defines a role that represents SCP-079. @@ -34,7 +41,7 @@ internal Scp079Role(Scp079GameRole baseRole) : base(baseRole) { SubroutineModule = baseRole.SubroutineModule; - Internal = baseRole; + Base = baseRole; if (!SubroutineModule.TryGetSubroutine(out Scp079SpeakerAbility scp079SpeakerAbility)) Log.Error("Scp079SpeakerAbility subroutine not found in Scp079Role::ctor"); @@ -89,8 +96,33 @@ internal Scp079Role(Scp079GameRole baseRole) Log.Error("Scp079CurrentCameraSync subroutine not found in Scp079Role::ctor"); CurrentCameraSync = scp079CameraSync; + + if (!SubroutineModule.TryGetSubroutine(out Scp079PingAbility scp079PingAbility)) + Log.Error("Scp079PingAbility subroutine not found in Scp079Role::ctor"); + + PingAbility = scp079PingAbility; + + if (!SubroutineModule.TryGetSubroutine(out Scp079TeslaAbility scp079TeslaAbility)) + Log.Error("Scp079TeslaAbility subroutine not found in Scp079Role::ctor"); + + TeslaAbility = scp079TeslaAbility; + + if (!SubroutineModule.TryGetSubroutine(out Scp079ScannerTracker scp079ScannerTracker)) + Log.Error("Scp079ScannerTracker subroutine not found in Scp079Role::ctor"); + + ScannerTracker = scp079ScannerTracker; + + if (!SubroutineModule.TryGetSubroutine(out Scp079ScannerZoneSelector scp079ScannerZoneSelector)) + Log.Error("Scp079ScannerZoneSelector subroutine not found in Scp079Role::ctor"); + + ScannerZoneSelector = scp079ScannerZoneSelector; } + /// + /// Gets a list of players who will be turned away from SCP-079's scan. + /// + public static HashSet TurnedPlayers { get; } = new(20); + /// public override RoleTypeId Type { get; } = RoleTypeId.Scp079; @@ -127,6 +159,16 @@ internal Scp079Role(Scp079GameRole baseRole) /// public Scp079RewardManager RewardManager { get; } + /// + /// Gets SCP-079's . + /// + public Scp079PingAbility PingAbility { get; } + + /// + /// Gets SCP-079's . + /// + public Scp079TeslaAbility TeslaAbility { get; } + /// /// Gets SCP-079's . /// @@ -152,14 +194,24 @@ internal Scp079Role(Scp079GameRole baseRole) /// public Scp079CurrentCameraSync CurrentCameraSync { get; } + /// + /// Gets SCP-079's . + /// + public Scp079ScannerTracker ScannerTracker { get; } + + /// + /// Gets SCP-079's . + /// + public Scp079ScannerZoneSelector ScannerZoneSelector { get; } + /// /// Gets or sets the camera SCP-079 is currently controlling. /// This value will return the Hcz079ContChamber Camera if SCP-079's current camera cannot be detected. /// public Camera Camera { - get => Camera.Get(Internal.CurrentCamera) ?? Camera.Get(CameraType.Hcz079ContChamber); - set => Internal._curCamSync.CurrentCamera = value.Base; + get => Camera.Get(Base.CurrentCamera) ?? Camera.Get(CameraType.Hcz079ContChamber); + set => Base._curCamSync.CurrentCamera = value.Base; } /// @@ -175,17 +227,17 @@ public Camera Camera /// /// Gets the speaker SCP-079 is currently using. Can be . /// - public Scp079Speaker Speaker => Scp079Speaker.TryGetSpeaker(Internal.CurrentCamera, out Scp079Speaker speaker) ? speaker : null; + public Scp079Speaker Speaker => Scp079Speaker.TryGetSpeaker(Base.CurrentCamera, out Scp079Speaker speaker) ? speaker : null; /// /// Gets the doors SCP-079 has locked. Can be . /// - public IEnumerable LockedDoors => DoorLockChanger._lockedDoors.Select(x => Door.Get(x)); + public Door LockedDoor => Door.Get(DoorLockChanger.LockedDoor); /// /// Gets or sets SCP-079's abilities. Can be . /// - public Scp079AbilityBase[] Abilities + public IScp079AuxRegenModifier[] Abilities { get => AuxManager._abilities; set => AuxManager._abilities = value; @@ -200,6 +252,16 @@ public int Experience set => TierManager.TotalExp = value; } + /// + /// Gets the Current Camera Position. + /// + public Vector3 CameraPosition => Base.CameraPosition; + + /// + /// Gets the relative experience. + /// + public float RelativeExperience => TierManager.RelativeExp; + /// /// Gets or sets SCP-079's level. /// @@ -254,6 +316,11 @@ public float RoomLockdownCooldown } } + /// + /// Gets the Remaining Lockdown Duration. + /// + public float RemainingLockdownDuration => LockdownRoomAbility.RemainingLockdownDuration; + /// /// Gets the amount of rooms that SCP-079 has blacked out. /// @@ -286,6 +353,11 @@ public float Scp2176LostTime set => LostSignalHandler._ghostlightLockoutDuration = value; } + /// + /// Gets the Roll Rotation of SCP-079. + /// + public float RollRotation => Base.RollRotation; + /// /// Gets a value indicating whether or not SCP-079's signal is lost due to SCP-2176. /// @@ -304,12 +376,12 @@ public float Scp2176LostTime /// /// Gets the game . /// - protected Scp079GameRole Internal { get; } + public new Scp079GameRole Base { get; } /// /// Unlocks all doors that SCP-079 has locked. /// - public void UnlockAllDoors() => DoorLockChanger.ServerUnlockAll(); + public void UnlockAllDoors() => DoorLockChanger.ServerUnlock(); /// /// Forces SCP-079's signal to be lost for the specified amount of time. @@ -324,24 +396,58 @@ public float Scp2176LostTime /// The reason to grant experience. public void AddExperience(int amount, Scp079HudTranslation reason = Scp079HudTranslation.ExpGainAdminCommand) => TierManager.ServerGrantExperience(amount, reason); + /// + /// Grants SCP-079 experience. + /// + /// The amount to grant. + /// The reason to grant experience. + /// The RoleType of the player that's causing it to happen. + public void AddExperience(int amount, Scp079HudTranslation reason, RoleTypeId subject) => TierManager.ServerGrantExperience(amount, reason, subject); + /// /// Locks the provided . /// /// The door to lock. - /// . - public bool LockDoor(Door door) => DoorLockChanger.SetDoorLock(door.Base, true); + /// if the door has been lock; otherwise, . + public bool LockDoor(Door door) + { + if (door is not null) + { + DoorLockChanger.LockedDoor = door.Base; + door.Lock((float)DoorLockChanger._lockTime, DoorLockType.Regular079); + return true; + } + + return false; + } /// /// Unlocks the provided . /// /// The door to unlock. - public void UnlockDoor(Door door) => DoorLockChanger.SetDoorLock(door.Base, false); + public void UnlockDoor(Door door) + { + if (door is not null && Door.Get(DoorLockChanger.LockedDoor) == door) + { + door.Unlock(); + } + } /// /// Marks a room as being modified by SCP-079 (granting experience if a kill happens in the room). /// /// The room to mark. - public void MarkRoom(Room room) => RewardManager.MarkRoom(room.Identifier); + public void MarkRoom(Room room) + { + if (room is not null) + RewardManager.MarkRoom(room.Identifier); + } + + /// + /// Marks a array of rooms as being modified by SCP-079 (granting experience if a kill happens in the room). + /// + /// The Array of Rooms to mark. + public void MarkRooms(IEnumerable rooms) => RewardManager.MarkRooms(rooms.Select(x => x.Identifier).ToArray()); /// /// Removes a marked room. @@ -349,7 +455,7 @@ public float Scp2176LostTime /// The room to remove. public void UnmarkRoom(Room room) { - if (RewardManager._markedRooms.ContainsKey(room.Identifier)) + if (room is not null && RewardManager._markedRooms.ContainsKey(room.Identifier)) RewardManager._markedRooms.Remove(room.Identifier); } @@ -363,7 +469,7 @@ public void UnmarkRoom(Room room) /// /// The camera to get the cost to switch to. /// The cost to switch from the current camera to the new camera. - public int GetSwitchCost(Camera camera) => CurrentCameraSync.GetSwitchCost(camera.Base); + public int GetSwitchCost(Camera camera) => camera is null ? CurrentCameraSync.GetSwitchCost(camera.Base) : 0; /// /// Gets the cost to modify a door. @@ -371,12 +477,103 @@ public void UnmarkRoom(Room room) /// The door to get the cost to modify. /// The action. /// The cost to modify the door. - public int GetCost(Door door, DoorAction action) + public int GetCost(Door door, DoorAction action) => action is DoorAction.Locked or DoorAction.Unlocked ? DoorLockChanger.GetCostForDoor(action, door.Base) : + DoorStateChanger.GetCostForDoor(action, door.Base); + + /// + /// Blackout the current room. + /// + /// Indicates if the energy cost should be consumed or not. + public void BlackoutRoom(bool consumeEnergy = true) + { + if (consumeEnergy) + BlackoutRoomAbility.AuxManager.CurrentAux -= BlackoutRoomAbility._cost; + + BlackoutRoomAbility.RewardManager.MarkRoom(BlackoutRoomAbility._roomController.Room); + BlackoutRoomAbility._blackoutCooldowns[BlackoutRoomAbility._roomController.netId] = NetworkTime.time + BlackoutRoomAbility._cooldown; + BlackoutRoomAbility._roomController.ServerFlickerLights(BlackoutRoomAbility._blackoutDuration); + BlackoutRoomAbility._successfulController = BlackoutRoomAbility._roomController; + BlackoutRoomAbility.ServerSendRpc(true); + } + + /// + /// Blackout the current zone. + /// + /// Indicates if the energy cost should be consumed or not. + public void BlackoutZone(bool consumeEnergy = true) + { + foreach (RoomLightController lightController in RoomLightController.Instances) + { + if (lightController.Room.Zone == BlackoutZoneAbility._syncZone) + { + lightController.ServerFlickerLights(BlackoutZoneAbility._duration); + } + } + + BlackoutZoneAbility._cooldownTimer.Trigger(BlackoutZoneAbility._cooldown); + + if (consumeEnergy) + BlackoutZoneAbility.AuxManager.CurrentAux -= BlackoutZoneAbility._cost; + + BlackoutZoneAbility.ServerSendRpc(true); + } + + /// + /// Trigger the Ping Ability to ping a . + /// + /// The SyncNormal Position. + /// The PingType to return. + /// Indicates if the energy cost should be consumed or not. + public void Ping(Vector3 position, PingType pingType = PingType.Default, bool consumeEnergy = true) { - if (action is DoorAction.Locked or DoorAction.Unlocked) - return DoorLockChanger.GetCostForDoor(action, door.Base); - else - return DoorStateChanger.GetCostForDoor(action, door.Base); + var relativePosition = new RelativePosition(position); + PingAbility._syncPos = relativePosition; + PingAbility._syncNormal = position; + pingType = (PingType)PingAbility._syncProcessorIndex; + + PingAbility.ServerSendRpc(x => PingAbility.ServerCheckReceiver(x, PingAbility._syncPos.Position, (int)pingType)); + + if (consumeEnergy) + PingAbility.AuxManager.CurrentAux -= PingAbility._cost; + + PingAbility._rateLimiter.RegisterInput(); } + + /// + /// Trigger the Lockdown Room Ability to lock the current room. + /// + public void LockdownRoom() => LockdownRoomAbility.ServerInitLockdown(); + + /// + /// Cancels the Actual Lockdown. + /// + public void CancelLockdown() => LockdownRoomAbility.ServerCancelLockdown(); + + /// + /// Trigger the SCP-079's Tesla Gate Ability. + /// + /// Indicates if the energy cost should be consume or not. + public void ActivateTesla(bool consumeEnergy = true) + { + Scp079Camera cam = CurrentCameraSync.CurrentCamera; + RewardManager.MarkRoom(cam.Room); + + if (!TeslaGateController.Singleton.TeslaGates.TryGetFirst(x => RoomIdUtils.IsTheSameRoom(cam.Position, x.transform.position), out var teslaGate)) + return; + + if (consumeEnergy) + AuxManager.CurrentAux -= TeslaAbility._cost; + + teslaGate.RpcInstantBurst(); + TeslaAbility._nextUseTime = NetworkTime.time + TeslaAbility._cooldown; + TeslaAbility.ServerSendRpc(false); + } + + /// + /// Gets the spawn chance of SCP-079. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Roles/Scp096Role.cs b/Exiled.API/Features/Roles/Scp096Role.cs index 9e932c13f2..384745f2d3 100644 --- a/Exiled.API/Features/Roles/Scp096Role.cs +++ b/Exiled.API/Features/Roles/Scp096Role.cs @@ -31,7 +31,7 @@ internal Scp096Role(Scp096GameRole baseRole) { SubroutineModule = baseRole.SubroutineModule; HumeShieldModule = baseRole.HumeShieldModule; - Internal = baseRole; + Base = baseRole; if (!SubroutineModule.TryGetSubroutine(out Scp096RageCycleAbility scp096RageCycleAbility)) Log.Error("RageCycleAbility subroutine not found in Scp096Role::ctor"); @@ -47,6 +47,21 @@ internal Scp096Role(Scp096GameRole baseRole) Log.Error("TargetsTracker not found in Scp096Role::ctor"); TargetsTracker = scp096TargetsTracker; + + if (!SubroutineModule.TryGetSubroutine(out Scp096AttackAbility scp096AttackAbility)) + Log.Error("AttackAbility not found in Scp096Role::ctor"); + + AttackAbility = scp096AttackAbility; + + if (!SubroutineModule.TryGetSubroutine(out Scp096TryNotToCryAbility scp096TryNotToCryAbility)) + Log.Error("TryNotToCryAbility not found in Scp096Role::ctor"); + + TryNotToCryAbility = scp096TryNotToCryAbility; + + if (!SubroutineModule.TryGetSubroutine(out Scp096ChargeAbility scp096ChargeAbility)) + Log.Error("ChargeAbility not found in Scp096Role::ctor"); + + ChargeAbility = scp096ChargeAbility; } /// @@ -78,15 +93,30 @@ internal Scp096Role(Scp096GameRole baseRole) /// public Scp096TargetsTracker TargetsTracker { get; } + /// + /// Gets SCP-096's . + /// + public Scp096AttackAbility AttackAbility { get; } + + /// + /// Gets SCP-096's . + /// + public Scp096TryNotToCryAbility TryNotToCryAbility { get; } + + /// + /// Gets SCP-096's . + /// + public Scp096ChargeAbility ChargeAbility { get; } + /// /// Gets a value indicating SCP-096's ability state. /// - public Scp096AbilityState AbilityState => Internal.StateController.AbilityState; + public Scp096AbilityState AbilityState => Base.StateController.AbilityState; /// /// Gets a value indicating SCP-096's rage state. /// - public Scp096RageState RageState => Internal.StateController.RageState; + public Scp096RageState RageState => Base.StateController.RageState; /// /// Gets a value indicating whether or not SCP-096 can receive targets. @@ -94,15 +124,33 @@ internal Scp096Role(Scp096GameRole baseRole) public bool CanReceiveTargets => RageCycleAbility._targetsTracker.CanReceiveTargets; /// - /// Gets or sets the amount of time in between SCP-096 charges. + /// Gets a value indicating whether or not SCP-096 can attack. + /// + public bool AttackPossible => AttackAbility.AttackPossible; + + /// + /// Gets or sets the Charge Ability Cooldown. /// public float ChargeCooldown { - get => RageCycleAbility._timeToChangeState; + get => ChargeAbility.Cooldown.Remaining; set { - RageCycleAbility._timeToChangeState = value; - RageCycleAbility.ServerSendRpc(true); + ChargeAbility.Cooldown.Remaining = value; + ChargeAbility.ServerSendRpc(true); + } + } + + /// + /// Gets or sets the Charge Ability duration. + /// + public float RemainingChargeDuration + { + get => ChargeAbility.Duration.Remaining; + set + { + ChargeAbility.Duration.Remaining = value; + ChargeAbility.ServerSendRpc(true); } } @@ -145,6 +193,15 @@ public float TotalEnrageTime } } + /// + /// Gets or sets a value indicating whether the TryNotToCry ability is active. + /// + public bool TryNotToCryActive + { + get => TryNotToCryAbility.IsActive; + set => TryNotToCryAbility.IsActive = value; + } + /// /// Gets a of Players that are currently targeted by SCP-096. /// @@ -153,56 +210,89 @@ public float TotalEnrageTime /// /// Gets the . /// - protected Scp096GameRole Internal { get; } + public new Scp096GameRole Base { get; } /// /// Adds the specified as an SCP-096 target. /// /// The player to add as a target. - public void AddTarget(Player player) => TargetsTracker.AddTarget(player.ReferenceHub, false); + /// if target was successfully added. Otherwise, . + public bool AddTarget(Player player) => player is not null && TargetsTracker.AddTarget(player.ReferenceHub, false); /// /// Adds the specified as an SCP-096 target. /// /// The player to add as a target. /// Is because player look SCP-096. - public void AddTarget(Player player, bool isLooking) => TargetsTracker.AddTarget(player.ReferenceHub, isLooking); + /// if target was successfully added. Otherwise, . + public bool AddTarget(Player player, bool isLooking) => player is not null && TargetsTracker.AddTarget(player.ReferenceHub, isLooking); /// /// Removes the specified from SCP-096's targets. /// /// The player to remove as a target. - public void RemoveTarget(Player player) => TargetsTracker.RemoveTarget(player.ReferenceHub); + /// if target was successfully removed. Otherwise, . + public bool RemoveTarget(Player player) => player is not null && TargetsTracker.RemoveTarget(player.ReferenceHub); /// /// Enrages SCP-096 for the given amount of times. /// /// The amount of time to enrage SCP-096. - public void Enrage(float time) => RageManager.ServerEnrage(time); + public void Enrage(float time = Scp096RageManager.MinimumEnrageTime) => RageManager.ServerEnrage(time); /// /// Ends SCP-096's enrage cycle. /// /// Whether or not to clear the remaining enrage time. - public void Calm(bool clearTime) => RageManager.ServerEndEnrage(clearTime); + public void Calm(bool clearTime = true) => RageManager.ServerEndEnrage(clearTime); /// /// Returns whether or not the provided is a target of SCP-096. /// /// The player to check. /// Whether or not the player is a target of SCP-096. - public bool HasTarget(Player player) => TargetsTracker.HasTarget(player.ReferenceHub); + public bool HasTarget(Player player) => player is not null && TargetsTracker.HasTarget(player.ReferenceHub); /// /// Returns whether or not the provided is observed by SCP-096. /// /// The player to check. /// Whether or not the player is observed. - public bool IsObserved(Player player) => TargetsTracker.IsObservedBy(player.ReferenceHub); + public bool IsObserved(Player player) => player is not null && TargetsTracker.IsObservedBy(player.ReferenceHub); /// /// Removes all targets from SCP-096's target list. /// public void ClearTargets() => TargetsTracker.ClearAllTargets(); + + /// + /// Trigger the attack ability. + /// + public void Attack() => AttackAbility.ServerAttack(); + + /// + /// Trigger the charge ability. + /// + /// The cooldown time to set before the charge can be executed again. + public void Charge(float cooldown = 1f) + { + ChargeAbility._hitHandler.Clear(); + ChargeAbility.Duration.Trigger(cooldown); + ChargeAbility.ScpRole.StateController.SetAbilityState(Scp096AbilityState.Charging); + ChargeAbility.ServerSendRpc(true); + } + + /// + /// Shows the input prompt for the RageCycle ability. + /// + /// The input prompt duration. + public void ShowRageInput(float duration = Scp096RageCycleAbility.DefaultActivationDuration) => RageCycleAbility.ServerTryEnableInput(duration); + + /// + /// Gets the Spawn Chance of SCP-096. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } } \ No newline at end of file diff --git a/Exiled.API/Features/Roles/Scp106Role.cs b/Exiled.API/Features/Roles/Scp106Role.cs index 148019980c..ffe00dc2ff 100644 --- a/Exiled.API/Features/Roles/Scp106Role.cs +++ b/Exiled.API/Features/Roles/Scp106Role.cs @@ -7,10 +7,14 @@ namespace Exiled.API.Features.Roles { + using System.Collections.Generic; + + using Exiled.API.Enums; using PlayerRoles; using PlayerRoles.PlayableScps.HumeShield; using PlayerRoles.PlayableScps.Scp106; using PlayerRoles.PlayableScps.Subroutines; + using PlayerStatsSystem; using UnityEngine; @@ -30,31 +34,31 @@ internal Scp106Role(Scp106GameRole baseRole) { SubroutineModule = baseRole.SubroutineModule; HumeShieldModule = baseRole.HumeShieldModule; - Internal = baseRole; + Base = baseRole; MovementModule = FirstPersonController.FpcModule as Scp106MovementModule; - if (!SubroutineModule.TryGetSubroutine(out Scp106Vigor scp106Vigor)) - Log.Error("Scp106Vigor subroutine not found in Scp096Role::ctor"); + if (!SubroutineModule.TryGetSubroutine(out Scp106VigorAbilityBase scp106VigorAbilityBase)) + Log.Error("Scp106VigorAbilityBase subroutine not found in Scp106Role::ctor"); - VigorComponent = scp106Vigor; + VigorAbility = scp106VigorAbilityBase; if (!SubroutineModule.TryGetSubroutine(out Scp106Attack scp106Attack)) - Log.Error("Scp106Attack subroutine not found in Scp096Role::ctor"); + Log.Error("Scp106Attack subroutine not found in Scp106Role::ctor"); Attack = scp106Attack; if (!SubroutineModule.TryGetSubroutine(out Scp106StalkAbility scp106StalkAbility)) - Log.Error("Scp106StalkAbility not found in Scp096Role::ctor"); + Log.Error("Scp106StalkAbility not found in Scp106Role::ctor"); StalkAbility = scp106StalkAbility; if (!SubroutineModule.TryGetSubroutine(out Scp106HuntersAtlasAbility scp106HuntersAtlasAbility)) - Log.Error("Scp106StalkAbility not found in Scp096Role::ctor"); + Log.Error("Scp106HuntersAtlasAbility not found in Scp106Role::ctor"); HuntersAtlasAbility = scp106HuntersAtlasAbility; if (!SubroutineModule.TryGetSubroutine(out Scp106SinkholeController scp106SinkholeController)) - Log.Error("Scp106StalkAbility not found in Scp096Role::ctor"); + Log.Error("Scp106SinkholeController not found in Scp106Role::ctor"); SinkholeController = scp106SinkholeController; } @@ -70,10 +74,15 @@ internal Scp106Role(Scp106GameRole baseRole) /// public HumeShieldModuleBase HumeShieldModule { get; } + /// + /// Gets the . + /// + public Scp106VigorAbilityBase VigorAbility { get; } + /// /// Gets the . /// - public Scp106Vigor VigorComponent { get; } + public Scp106Vigor VigorComponent => VigorAbility.Vigor; /// /// Gets the . @@ -105,8 +114,8 @@ internal Scp106Role(Scp106GameRole baseRole) /// public float Vigor { - get => VigorComponent.VigorAmount; - set => VigorComponent.VigorAmount = value; + get => VigorAbility.VigorAmount; + set => VigorAbility.VigorAmount = value; } /// @@ -114,20 +123,64 @@ public float Vigor /// public bool IsSubmerged { - get => Internal.IsSubmerged; + get => Base.IsSubmerged; set => HuntersAtlasAbility.SetSubmerged(value); } /// - /// Gets a value indicating whether or not SCP-106 is ready for idle. + /// Gets a value indicating whether or not SCP-106 can activate teslas. + /// + public bool CanActivateTesla => Base.CanActivateShock; + + /// + /// Gets a value indicating whether if SCP-106 can be cleared. /// - public bool CanActivateIdle => Internal.CanActivateIdle; + public bool CanStopStalk => StalkAbility.CanBeCleared; /// /// Gets a value indicating whether or not SCP-106 is currently slow down by a door. /// public bool IsSlowdown => MovementModule._slowndownTarget is < 1; + /// + /// Gets a value indicating the current time of the sinkhole. + /// + public float SinkholeCurrentTime => SinkholeController.ElapsedToggle; + + /// + /// Gets a value indicating the normalized state of the sinkhole. + /// + public float SinkholeNormalizedState => SinkholeController.NormalizedState; + + /// + /// Gets a value indicating whether or not SCP-106 is currently in the middle of an animation. + /// + public bool IsDuringAnimation => SinkholeController.IsDuringAnimation; + + /// + /// Gets a value indicating whether or not SCP-106 sinkhole is hidden. + /// + public bool IsSinkholeHidden => SinkholeController.IsHidden; + + /// + /// Gets or sets a value indicating whether the current sinkhole state. + /// + public bool SinkholeState + { + get => SinkholeController.State; + set => SinkholeController.State = value; + } + + /// + /// Gets the sinkhole target duration. + /// + public float SinkholeTargetDuration => SinkholeController.TargetDuration; + + /// + /// Gets the speed multiplier of the sinkhole. + /// + public float SinkholeSpeedMultiplier => SinkholeController.SpeedMultiplier; + /// /// Gets or sets the amount of time in between player captures. /// @@ -141,6 +194,19 @@ public float CaptureCooldown } } + /// + /// Gets or sets the Sinkhole cooldown. + /// + public float RemainingSinkholeCooldown + { + get => SinkholeController.Cooldown.Remaining; + set + { + SinkholeController.Cooldown.Remaining = value; + SinkholeController.ServerSendRpc(true); + } + } + /// /// Gets or sets a value indicating whether or not SCP-106 will enter his stalking mode. /// @@ -153,7 +219,7 @@ public bool IsStalking /// /// Gets the . /// - protected Scp106GameRole Internal { get; } + public new Scp106GameRole Base { get; } /// /// Forces SCP-106 to use its portal, and Teleport to position. @@ -164,9 +230,7 @@ public bool IsStalking public bool UsePortal(Vector3 position, float cost = 0f) { if (Room.Get(position) is not Room room) - { - throw new System.InvalidOperationException("Invalid room provided."); - } + return false; HuntersAtlasAbility._syncRoom = room.Identifier; HuntersAtlasAbility._syncPos = position; @@ -179,5 +243,35 @@ public bool UsePortal(Vector3 position, float cost = 0f) return true; } + + /// + /// Send a player to the pocket dimension. + /// + /// The to send. + public void CapturePlayer(Player player) // Convert to bool. + { + if (player is null) + return; + Attack._targetHub = player.ReferenceHub; + DamageHandlerBase handler = new ScpDamageHandler(Attack.Owner, Attack._damage, DeathTranslations.PocketDecay); + + if (!Attack._targetHub.playerStats.DealDamage(handler)) + return; + + Attack.SendCooldown(Attack._hitCooldown); + VigorAbility.VigorAmount += Scp106Attack.VigorCaptureReward; + Attack.ReduceSinkholeCooldown(); + Hitmarker.SendHitmarker(Attack.Owner, 1f); + + player.EnableEffect(EffectType.Corroding); + player.EnableEffect(EffectType.SinkHole); + } + + /// + /// Gets the Spawn Chance of SCP-106. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } } \ No newline at end of file diff --git a/Exiled.API/Features/Roles/Scp173Role.cs b/Exiled.API/Features/Roles/Scp173Role.cs index c2574294ee..5165a78d35 100644 --- a/Exiled.API/Features/Roles/Scp173Role.cs +++ b/Exiled.API/Features/Roles/Scp173Role.cs @@ -7,16 +7,16 @@ namespace Exiled.API.Features.Roles { + using System; using System.Collections.Generic; using System.Linq; + using Exiled.API.Features.Hazards; using Mirror; - using PlayerRoles; using PlayerRoles.PlayableScps.HumeShield; using PlayerRoles.PlayableScps.Scp173; using PlayerRoles.PlayableScps.Subroutines; - using UnityEngine; using Scp173GameRole = PlayerRoles.PlayableScps.Scp173.Scp173Role; @@ -33,6 +33,7 @@ public class Scp173Role : FpcRole, ISubroutinedScpRole, IHumeShieldRole internal Scp173Role(Scp173GameRole baseRole) : base(baseRole) { + Base = baseRole; SubroutineModule = baseRole.SubroutineModule; HumeShieldModule = baseRole.HumeShieldModule; MovementModule = FirstPersonController.FpcModule as Scp173MovementModule; @@ -61,6 +62,11 @@ internal Scp173Role(Scp173GameRole baseRole) Log.Error("Scp173AudioPlayer not found in Scp173Role::ctor"); AudioPlayer = scp173AudioPlayer; + + if (!SubroutineModule.TryGetSubroutine(out Scp173BreakneckSpeedsAbility scp173BreakneckSpeedsAbility)) + Log.Error("Scp173BreakneckSpeedsAbility not found in Scp173Role::ctor"); + + BreakneckSpeedsAbility = scp173BreakneckSpeedsAbility; } /// @@ -102,6 +108,11 @@ internal Scp173Role(Scp173GameRole baseRole) /// public Scp173TantrumAbility TantrumAbility { get; } + /// + /// Gets SCP-173's . + /// + public Scp173BreakneckSpeedsAbility BreakneckSpeedsAbility { get; } + /// /// Gets the SCP-173's . /// @@ -110,12 +121,28 @@ internal Scp173Role(Scp173GameRole baseRole) /// /// Gets or sets the amount of time before SCP-173 can use breakneck speed again. /// - public float BreakneckCooldown { get; set; } = 40f; // It's hardcoded //TODO + public float RemainingBreakneckCooldown + { + get => BreakneckSpeedsAbility.Cooldown.Remaining; + set + { + BreakneckSpeedsAbility.Cooldown.Remaining = value; + BreakneckSpeedsAbility.ServerSendRpc(true); + } + } /// /// Gets or sets the amount of time before SCP-173 can place a tantrum. /// - public float TantrumCooldown { get; set; } = 30f; // It's hardcoded //TODO + public float RemainingTantrumCooldown + { + get => TantrumAbility.Cooldown.Remaining; + set + { + TantrumAbility.Cooldown.Remaining = value; + TantrumAbility.ServerSendRpc(true); + } + } /// /// Gets a value indicating whether or not SCP-173 is currently being viewed by one or more players. @@ -154,9 +181,19 @@ public bool BlinkReady get => BlinkTimer.AbilityReady; set { - BlinkTimer._endSustainTime = -1; - BlinkTimer._totalCooldown = 0; - BlinkTimer._initialStopTime = NetworkTime.time; + if (value) + { + BlinkTimer._endSustainTime = -1; + BlinkTimer._totalCooldown = 0; + BlinkTimer._initialStopTime = NetworkTime.time; + } + else + { + BlinkTimer.ResetObject(); + BlinkTimer._observers.UpdateObservers(); + } + + BlinkTimer.ServerSendRpc(true); } } @@ -170,6 +207,7 @@ public float BlinkCooldown { BlinkTimer._initialStopTime = NetworkTime.time; BlinkTimer._totalCooldown = value; + BlinkTimer.ServerSendRpc(true); } } @@ -183,17 +221,22 @@ public float BlinkCooldown /// public bool BreakneckActive { - get => TeleportAbility._breakneckSpeedsAbility.IsActive; - set => TeleportAbility._breakneckSpeedsAbility.IsActive = value; + get => BreakneckSpeedsAbility.IsActive; + set => BreakneckSpeedsAbility.IsActive = value; } + /// + /// Gets the instance. + /// + public new Scp173GameRole Base { get; } + /// /// Places a Tantrum (SCP-173's ability) under the player. /// /// Whether or not to place the tantrum if SCP-173 is currently being viewed. /// The cooldown until SCP-173 can place a tantrum again. Set to 0 to not affect the cooldown. - /// The tantrum's , or if it cannot be placed. - public GameObject Tantrum(bool failIfObserved = false, float cooldown = 0) + /// The instance, or if it cannot be placed. + public TantrumHazard PlaceTantrum(bool failIfObserved = false, float cooldown = 0) { if (failIfObserved && IsObserved) return null; @@ -208,5 +251,18 @@ public GameObject Tantrum(bool failIfObserved = false, float cooldown = 0) /// /// The SoundId to Play. public void SendAudio(Scp173AudioPlayer.Scp173SoundId soundId) => AudioPlayer.ServerSendSound(soundId); + + /// + /// Teleport SCP-173 using the blink ability to the Target Position. + /// + /// The Target Position. + public void Blink(Vector3 targetPos) => BlinkTimer.ServerBlink(targetPos); + + /// + /// Gets the Spawn Chance of SCP-173. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } } \ No newline at end of file diff --git a/Exiled.API/Features/Roles/Scp939Role.cs b/Exiled.API/Features/Roles/Scp939Role.cs index 4382030a00..67c5565156 100644 --- a/Exiled.API/Features/Roles/Scp939Role.cs +++ b/Exiled.API/Features/Roles/Scp939Role.cs @@ -37,6 +37,7 @@ public class Scp939Role : FpcRole, ISubroutinedScpRole, IHumeShieldRole internal Scp939Role(Scp939GameRole baseRole) : base(baseRole) { + Base = baseRole; SubroutineModule = baseRole.SubroutineModule; HumeShieldModule = baseRole.HumeShieldModule; @@ -79,6 +80,8 @@ internal Scp939Role(Scp939GameRole baseRole) Log.Error("FirearmRippleTrigger not found in Scp939Role::ctor"); FirearmRippleTrigger = firearmRippleTrigger; + + MimicPointController = EnvironmentalMimicry._mimicPoint; } /// @@ -110,6 +113,11 @@ internal Scp939Role(Scp939GameRole baseRole) /// public Scp939LungeAbility LungeAbility { get; } + /// + /// Gets SCP-939's . + /// + public MimicPointController MimicPointController { get; } + /// /// Gets SCP-939's . /// @@ -176,6 +184,19 @@ public float AmnesticCloudCooldown } } + /// + /// Gets or sets the duration of the amnestic cloud. + /// + public float AmnesticCloudDuration + { + get => AmnesticCloudAbility.Duration.Remaining; + set + { + AmnesticCloudAbility.Duration.Remaining = value; + AmnesticCloudAbility.ServerSendRpc(true); + } + } + /// /// Gets or sets the amount of time before SCP-939 can use any of its mimicry abilities again. /// @@ -197,18 +218,23 @@ public float MimicryCooldown /// /// Gets a value indicating whether or not SCP-939 has a placed mimic point. /// - public bool MimicryPointActive => EnvironmentalMimicry._mimicPoint.Active; + public bool MimicryPointActive => MimicPointController.Active; /// /// Gets a value indicating the position of SCP-939's mimic point. May be if is . /// - public Vector3? MimicryPointPosition => EnvironmentalMimicry._mimicPoint.Active ? EnvironmentalMimicry._mimicPoint.MimicPointTransform.position : null; + public Vector3? MimicryPointPosition => MimicPointController.Active ? MimicPointController.MimicPointTransform.position : null; /// /// Gets a list of players this SCP-939 instance can see regardless of their movement. /// public List VisiblePlayers { get; } = ListPool.Pool.Get(); + /// + /// Gets the instance. + /// + public new Scp939GameRole Base { get; } + /// /// Removes all recordings of player voices. Provide an optional target to remove all the recordings of a single player. /// @@ -218,7 +244,6 @@ public void ClearRecordings(Player target) if (target is null) return; MimicryRecorder.RemoveRecordingsOfPlayer(target.ReferenceHub); - MimicryRecorder.SavedVoicesModified = true; } /// @@ -228,7 +253,6 @@ public void ClearRecordings() { MimicryRecorder.SavedVoices.Clear(); MimicryRecorder._serverSentVoices.Clear(); - MimicryRecorder.SavedVoicesModified = true; } /// @@ -239,6 +263,8 @@ public void ClearRecordings() /// The Player to send the Ripple Sound. public void PlayRippleSound(UsableRippleType ripple, Vector3 position, Player playerToSend) { + if (playerToSend is null) + return; switch (ripple) { case UsableRippleType.Footstep: @@ -252,5 +278,44 @@ public void PlayRippleSound(UsableRippleType ripple, Vector3 position, Player pl break; } } + + /// + /// Created a Amnestic Cloud at the SCP-939's position. + /// + /// The duration of the Amnestic cloud. + public void CreateCloud(float duration) + { + AmnesticCloudAbility.OnStateEnabled(); + AmnesticCloudAbility.ServerConfirmPlacement(duration); + } + + /// + /// Place a Mimic Point at the specified position. + /// + /// The Position of the Mimic Point. + public void PlaceMimicPoint(Vector3 mimicPointPosition) + { + MimicPointController._syncPos = new RelativePosition(mimicPointPosition); + MimicPointController._syncMessage = MimicPointController.RpcStateMsg.PlacedByUser; + MimicPointController.Active = true; + MimicPointController.ServerSendRpc(true); + } + + /// + /// Destroys the Current Mimic Point. + /// + public void DestroyCurrentMimicPoint() + { + MimicPointController._syncMessage = MimicPointController.RpcStateMsg.RemovedByUser; + MimicPointController.Active = false; + MimicPointController.ServerSendRpc(true); + } + + /// + /// Gets the Spawn Chance of SCP-939. + /// + /// The List of Roles already spawned. + /// The Spawn Chance. + public float GetSpawnChance(List alreadySpawned) => Base.GetSpawnChance(alreadySpawned); } } diff --git a/Exiled.API/Features/Roles/SpectatorRole.cs b/Exiled.API/Features/Roles/SpectatorRole.cs index 0883f2e720..cdaf0fe864 100644 --- a/Exiled.API/Features/Roles/SpectatorRole.cs +++ b/Exiled.API/Features/Roles/SpectatorRole.cs @@ -27,7 +27,7 @@ public class SpectatorRole : Role internal SpectatorRole(SpectatorGameRole baseRole) : base(baseRole) { - Internal = baseRole; + Base = baseRole; } /// @@ -46,12 +46,12 @@ internal SpectatorRole(SpectatorGameRole baseRole) /// /// Gets the 's death position. /// - public Vector3 DeathPosition => Internal.DeathPosition.Position; + public Vector3 DeathPosition => Base.DeathPosition.Position; /// /// Gets a value indicating whether the is ready to respawn or not. /// - public bool IsReadyToRespawn => Internal.ReadyToRespawn; + public bool IsReadyToRespawn => Base.ReadyToRespawn; /// /// Gets currently spectated by this . May be . @@ -60,7 +60,7 @@ public Player SpectatedPlayer { get { - Player spectatedPlayer = Player.Get(Internal.SyncedSpectatedNetId); + Player spectatedPlayer = Player.Get(Base.SyncedSpectatedNetId); return spectatedPlayer != Owner ? spectatedPlayer : null; } @@ -69,6 +69,6 @@ public Player SpectatedPlayer /// /// Gets the game . /// - private SpectatorGameRole Internal { get; } + public new SpectatorGameRole Base { get; } } } diff --git a/Exiled.API/Features/Room.cs b/Exiled.API/Features/Room.cs index d658921377..d90e211d65 100644 --- a/Exiled.API/Features/Room.cs +++ b/Exiled.API/Features/Room.cs @@ -12,21 +12,21 @@ namespace Exiled.API.Features using System.Linq; using Enums; - using Exiled.API.Extensions; + using Exiled.API.Features.Doors; using Exiled.API.Features.Pickups; using Exiled.API.Interfaces; - using Interactables.Interobjects.DoorUtils; + using Interactables.Interobjects.DoorUtils; using MapGeneration; - using MEC; - using Mirror; - using PlayerRoles.PlayableScps.Scp079; using RelativePositioning; using UnityEngine; + using Utils.NonAllocLINQ; + + using static PlayerList; /// /// The in-game room. @@ -41,7 +41,7 @@ public class Room : MonoBehaviour, IWorldSpace /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => RoomIdentifierToRoom.Values; + public static IReadOnlyCollection List => RoomIdentifierToRoom.Values; /// /// Gets the name. @@ -80,6 +80,11 @@ public class Room : MonoBehaviour, IWorldSpace /// public RoomName RoomName => Identifier.Name; + /// + /// Gets the room's . + /// + public RoomShape RoomShape => Identifier.Shape; + /// /// Gets the . /// @@ -93,7 +98,7 @@ public class Room : MonoBehaviour, IWorldSpace /// /// Gets a reference to the in the room, or if this room does not contain one. /// - public TeslaGate TeslaGate { get; private set; } + public TeslaGate TeslaGate { get; internal set; } /// /// Gets a of in the . @@ -101,89 +106,100 @@ public class Room : MonoBehaviour, IWorldSpace public IEnumerable Players => Player.List.Where(player => player.IsAlive && player.CurrentRoom is not null && (player.CurrentRoom.Transform == Transform)); /// - /// Gets a of in the . + /// Gets a of in the . /// - public IEnumerable Doors { get; private set; } = Enumerable.Empty(); + public IReadOnlyCollection Windows { get; private set; } /// - /// Gets a of in the . + /// Gets a of in the . /// - public IEnumerable Speaker { get; private set; } = Enumerable.Empty(); + public IReadOnlyCollection Doors { get; private set; } /// - /// Gets a of in the . + /// Gets a of in the . /// - public IEnumerable Pickups - { - get - { - List pickups = new(); - foreach (Pickup pickup in Pickup.List) - { - if (Room.FindParentRoom(pickup.GameObject) == this) - pickups.Add(pickup); - } + public IReadOnlyCollection Speakers { get; private set; } - return pickups; - } - } + /// + /// Gets a of in the . + /// + public IReadOnlyCollection Cameras { get; private set; } /// - /// Gets or sets the intensity of the lights in the room. + /// Gets a of in the . /// - public float LightIntensity - { - get => (float)FlickerableLightController?.Network_lightIntensityMultiplier; - set - { - if (FlickerableLightController) - FlickerableLightController.Network_lightIntensityMultiplier = value; - } - } + /// + /// Using that will make sense only for rooms with more than one light controller, in other cases better to use . + /// + public IReadOnlyCollection RoomLightControllers { get; private set; } + + /// + /// Gets a of in the . + /// + public IEnumerable Pickups => Pickup.List.Where(pickup => FindParentRoom(pickup.GameObject) == this); /// /// Gets or sets the color of the room's lights by changing the warhead color. /// public Color Color { - get => (Color)FlickerableLightController?.WarheadLightColor; + get => RoomLightController.NetworkOverrideColor; set { - if (FlickerableLightController) + if (RoomLightController) { - FlickerableLightController.WarheadLightColor = value; - FlickerableLightController.WarheadLightOverride = true; + RoomLightController.NetworkOverrideColor = value; } } } - /// - /// Gets a of in the . - /// - public IEnumerable Cameras { get; private set; } = Enumerable.Empty(); - /// /// Gets or sets a value indicating whether or not the lights in this room are currently off. /// public bool AreLightsOff { - get => FlickerableLightController && !FlickerableLightController.NetworkLightsEnabled; + get => RoomLightController && !RoomLightController.NetworkLightsEnabled; set { - if (FlickerableLightController) - FlickerableLightController.NetworkLightsEnabled = !value; + if (RoomLightController) + RoomLightController.NetworkLightsEnabled = !value; } } /// /// Gets the FlickerableLightController's NetworkIdentity. /// - public NetworkIdentity FlickerableLightControllerNetIdentity => FlickerableLightController.netIdentity; + public NetworkIdentity RoomLightControllerNetIdentity => RoomLightController.netIdentity; /// /// Gets the room's FlickerableLightController. /// - public FlickerableLightController FlickerableLightController { get; private set; } + public RoomLightController RoomLightController => RoomLightControllers.Count == 0 ? RoomLightControllers.ElementAt(0) : null; + + /// + /// Gets a containing all known s in that . + /// + internal List WindowsValue { get; } = new(); + + /// + /// Gets a containing all known s in that . + /// + internal List DoorsValue { get; } = new(); + + /// + /// Gets a containing all known s in that . + /// + internal List SpeakersValue { get; } = new(); + + /// + /// Gets a containing all known s in that . + /// + internal List CamerasValue { get; } = new(); + + /// + /// Gets a containing all known s in that . + /// + internal List RoomLightControllersValue { get; } = new(); /// /// Gets a given the specified . @@ -197,16 +213,15 @@ public bool AreLightsOff /// /// The to search with. /// The of the given identified, if any. Can be . - public static Room Get(RoomIdentifier roomIdentifier) => RoomIdentifierToRoom.TryGetValue(roomIdentifier, out Room room) - ? room - : null; + public static Room Get(RoomIdentifier roomIdentifier) => roomIdentifier == null ? null : + RoomIdentifierToRoom.TryGetValue(roomIdentifier, out Room room) ? room : null; /// /// Gets a from a given . /// - /// The to search with. + /// The to search with. /// The of the given identified, if any. Can be . - public static Room Get(FlickerableLightController flickerableLightController) => flickerableLightController.GetComponentInParent(); + public static Room Get(RoomLightController flickerableLightController) => flickerableLightController.GetComponentInParent(); /// /// Gets a given the specified . @@ -291,11 +306,18 @@ public static Room Random(ZoneType zoneType = ZoneType.Unspecified) /// Local position, based on the room. public Vector3 LocalPosition(Vector3 position) => Transform.TransformPoint(position); + /// + /// Returns the World position, based on a local space position. + /// + /// Local position. + /// World position, based on the room. + public Vector3 WorldPosition(Vector3 offset) => Transform.InverseTransformPoint(offset); + /// /// Flickers the room's lights off for a duration. /// /// Duration in seconds. - public void TurnOffLights(float duration) => FlickerableLightController?.ServerFlickerLights(duration); + public void TurnOffLights(float duration) => RoomLightController?.ServerFlickerLights(duration); /// /// Locks all the doors in the room. @@ -349,26 +371,27 @@ public void UnlockAll() /// public void ResetColor() { - if (!FlickerableLightController) + if (!RoomLightController) return; - FlickerableLightController.WarheadLightColor = FlickerableLightController.DefaultWarheadColor; - FlickerableLightController.WarheadLightOverride = false; + RoomLightController.NetworkOverrideColor = Color.clear; } /// /// Returns the Room in a human-readable format. /// /// A string containing Room-related data. - public override string ToString() => $"{Type} ({Zone}) [{Doors?.Count()}] *{Cameras?.Count()}* |{TeslaGate}|"; + public override string ToString() => $"{Type} ({Zone}) [{Doors.Count}] *{Cameras.Count}* |{TeslaGate != null}|"; /// /// Factory method to create and add a component to a Transform. /// We can add parameters to be set privately here. /// /// The Game Object to attach the Room component to. - /// The Room component that was instantiated onto the Game Object. - internal static Room CreateComponent(GameObject roomGameObject) => roomGameObject.AddComponent(); + internal static void CreateComponent(GameObject roomGameObject) + { + roomGameObject.AddComponent().InternalCreate(); + } private static RoomType FindType(GameObject gameObject) { @@ -450,20 +473,41 @@ private static ZoneType FindZone(GameObject gameObject) }; } - private void Awake() + private void InternalCreate() { + Identifier = gameObject.GetComponent(); + RoomIdentifierToRoom.Add(Identifier, this); + Zone = FindZone(gameObject); +#if Debug + if (Type is RoomType.Unknown) + Log.Error($"[ZONETYPE UNKNOWN] {this}"); +#endif Type = FindType(gameObject); +#if Debug + if (Type is RoomType.Unknown) + Log.Error($"[ROOMTYPE UNKNOWN] {this}"); +#endif - Identifier = gameObject.GetComponent(); - FlickerableLightController = gameObject.GetComponentInChildren(); + RoomLightControllersValue.AddRange(gameObject.GetComponentsInChildren()); - Doors = DoorVariant.DoorsByRoom.ContainsKey(Identifier) ? DoorVariant.DoorsByRoom[Identifier].Select(x => Door.Get(x, this)).ToList() : new(); - Cameras = Camera.List.Where(x => x.Base.Room == Identifier).ToList(); - Speaker = Scp079Speaker.SpeakersInRooms.ContainsKey(Identifier) ? Scp079Speaker.SpeakersInRooms[Identifier] : new(); + RoomLightControllers = RoomLightControllersValue.AsReadOnly(); + + GetComponentsInChildren().ForEach(component => + { + Window window = new(component, this); + window.Room.WindowsValue.Add(window); + }); + + if (GetComponentInChildren() is global::TeslaGate tesla) + { + TeslaGate = new TeslaGate(tesla, this); + } - if (Type is RoomType.HczTesla) - TeslaGate = TeslaGate.List.Single(x => this == x.Room); + Windows = WindowsValue.AsReadOnly(); + Doors = DoorsValue.AsReadOnly(); + Speakers = SpeakersValue.AsReadOnly(); + Cameras = CamerasValue.AsReadOnly(); } } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Round.cs b/Exiled.API/Features/Round.cs index 30a608904e..11e44049a9 100644 --- a/Exiled.API/Features/Round.cs +++ b/Exiled.API/Features/Round.cs @@ -23,6 +23,11 @@ namespace Exiled.API.Features /// public static class Round { + /// + /// Gets a list of players who will be ignored from determining round end. + /// + public static HashSet IgnoredPlayers { get; } = new(20); + /// /// Gets the time elapsed from the start of the round. /// @@ -128,6 +133,24 @@ public static int ChangedIntoZombies set => RoundSummary.ChangedIntoZombies = value; } + /// + /// Gets or sets the timer for waiting players in lobby. + /// + public static short LobbyWaitingTime + { + get => RoundStart.singleton.NetworkTimer; + set => RoundStart.singleton.NetworkTimer = value; + } + + /// + /// Gets or sets the action to do at round end. + /// + public static ServerStatic.NextRoundAction NextRoundAction + { + get => ServerStatic.StopNextRound; + set => ServerStatic.StopNextRound = value; + } + /// /// Gets the number of rounds since the server started. /// diff --git a/Exiled.API/Features/Scp914.cs b/Exiled.API/Features/Scp914.cs index 7ce5efa534..f138c75049 100644 --- a/Exiled.API/Features/Scp914.cs +++ b/Exiled.API/Features/Scp914.cs @@ -11,8 +11,6 @@ namespace Exiled.API.Features using UnityEngine; - using Utils.ConfigHandler; - /// /// A set of tools to modify SCP-914's behaviour. /// @@ -83,11 +81,13 @@ public static Scp914Mode ConfigMode /// There are two sounds only. /// The values to identify them are 0, which stands for the soundId played when SCP-914 is being activated, /// and 1, which stands for the soundId played when SCP-914's knob state is being changed. - public static void PlaySound(byte soundId) => Scp914Controller.RpcPlaySound(soundId); + public static void PlaySound(Scp914InteractCode soundId) => Scp914Controller.RpcPlaySound((byte)soundId); /// /// Starts SCP-914. /// - public static void Start() => Scp914Controller.ServerInteract(Server.Host.ReferenceHub, (byte)Scp914InteractCode.Activate); + /// Player who interacts with Scp914. + /// Activated code. + public static void Start(Player player = null, Scp914InteractCode code = Scp914InteractCode.Activate) => Scp914Controller.ServerInteract((player ?? Server.Host).ReferenceHub, (byte)code); } } \ No newline at end of file diff --git a/Exiled.API/Features/Server.cs b/Exiled.API/Features/Server.cs index fe427f5499..36338094b9 100644 --- a/Exiled.API/Features/Server.cs +++ b/Exiled.API/Features/Server.cs @@ -157,16 +157,6 @@ public static int MaxPlayerCount /// public static float LateJoinTime => ConfigFile.ServerConfig.GetFloat(RoleAssigner.LateJoinKey, 0f); - /// - /// Gets or sets the spawn protection time, in seconds. - /// - [Obsolete("Use Respawn.SpawnProtectTime.")] - public static float SpawnProtectTime - { - get => Respawn.ProtectionTime; - set => Respawn.ProtectionTime = value; - } - /// /// Gets or sets a value indicating whether the server is marked as Heavily Modded. /// @@ -175,8 +165,8 @@ public static float SpawnProtectTime /// public static bool IsHeavilyModded { - get => CustomNetworkManager.HeavilyModded; - set => CustomNetworkManager.HeavilyModded = value; + get => ServerConsole.TransparentlyModdedServerConfig; + set => ServerConsole.TransparentlyModdedServerConfig = value; } /// @@ -188,6 +178,11 @@ public static bool IsWhitelisted set => ServerConsole.WhiteListEnabled = value; } + /// + /// Gets a value indicating whether or not this server is verified. + /// + public static bool IsVerified => CustomNetworkManager.IsVerified; + /// /// Gets or sets a value indicating whether or not idle mode is enabled. /// @@ -253,7 +248,7 @@ public static bool ShutdownRedirect(ushort redirectPort) /// /// The command to be run. /// The running the command. - public static void RunCommand(string command, CommandSender sender = null) => GameCore.Console.singleton.TypeCommand(command, sender ?? Host.Sender); + public static void RunCommand(string command, CommandSender sender = null) => GameCore.Console.singleton.TypeCommand(command, sender); /// /// Safely gets an from , then casts it to . diff --git a/Exiled.API/Features/TeslaGate.cs b/Exiled.API/Features/TeslaGate.cs index 24c09d4ad5..758bd6e9eb 100644 --- a/Exiled.API/Features/TeslaGate.cs +++ b/Exiled.API/Features/TeslaGate.cs @@ -12,12 +12,10 @@ namespace Exiled.API.Features using System.Linq; using Exiled.API.Interfaces; - + using global::Hazards; using Hazards; using MEC; - using PlayerRoles; - using UnityEngine; using BaseTeslaGate = global::TeslaGate; @@ -31,22 +29,23 @@ public class TeslaGate : IWrapper, IWorldSpace /// A containing all known s and their corresponding . /// internal static readonly Dictionary BaseTeslaGateToTeslaGate = new(10); - private Room room; /// /// Initializes a new instance of the class. /// /// The instance. - internal TeslaGate(BaseTeslaGate baseTeslaGate) + /// The for this tesla. + internal TeslaGate(BaseTeslaGate baseTeslaGate, Room room) { Base = baseTeslaGate; BaseTeslaGateToTeslaGate.Add(baseTeslaGate, this); + Room = room; } /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => BaseTeslaGateToTeslaGate.Values; + public static IReadOnlyCollection List => BaseTeslaGateToTeslaGate.Values; /// /// Gets or sets a of which contains all the players ignored by tesla gates. @@ -91,7 +90,7 @@ internal TeslaGate(BaseTeslaGate baseTeslaGate) /// /// Gets the tesla gate's which is located in. /// - public Room Room => room ??= Room.FindParentRoom(GameObject); + public Room Room { get; } /// /// Gets a value indicating whether or not the tesla gate's shock burst is in progess. @@ -178,9 +177,9 @@ public bool UseInstantBurst } /// - /// Gets a of which contains all the tantrums to destroy. + /// Gets a of which contains all the tantrums to destroy. /// - public List TantrumsToDestroy => Base.TantrumsToBeDestroyed; + public IEnumerable TantrumsToDestroy => Base.TantrumsToBeDestroyed.Select(x => Hazard.Get(x) as TantrumHazard); /// /// Gets a of which contains all the players inside the hurt range. @@ -204,7 +203,7 @@ public bool UseInstantBurst /// The corresponding instance. public static TeslaGate Get(BaseTeslaGate baseTeslaGate) => BaseTeslaGateToTeslaGate.TryGetValue(baseTeslaGate, out TeslaGate teslagate) ? teslagate : - new(baseTeslaGate); + new(baseTeslaGate, Room.FindParentRoom(baseTeslaGate.gameObject)); /// /// Gets a of filtered based on a predicate. @@ -263,28 +262,28 @@ public void ForceTrigger() /// /// The to check. /// if the given is in the hurt range of the tesla gate; otherwise, . - public bool IsPlayerInHurtRange(Player player) => Vector3.Distance(Position, player.Position) <= Base.sizeOfTrigger * 2.2f; + public bool IsPlayerInHurtRange(Player player) => player is not null && Vector3.Distance(Position, player.Position) <= Base.sizeOfTrigger * 2.2f; /// /// Gets a value indicating whether the is in the idle range of a specific tesla gate. /// /// The to check. /// if the given is in the idle range of the tesla gate; otherwise, . - public bool IsPlayerInIdleRange(Player player) => Base.PlayerInIdleRange(player.ReferenceHub); + public bool IsPlayerInIdleRange(Player player) => player is not null && Base.IsInIdleRange(player.ReferenceHub); /// /// Gets a value indicating whether the is in the trigger range of a specific tesla gate. /// /// The to check. /// if the given is in the trigger range of the tesla gate; otherwise, . - public bool IsPlayerInTriggerRange(Player player) => Base.PlayerInRange(player.ReferenceHub); + public bool IsPlayerInTriggerRange(Player player) => player is not null && Base.PlayerInRange(player.ReferenceHub); /// /// Gets a value indicating whether the tesla gate can be idle by a specific . /// /// The to check. /// if the given can idle the tesla gate; otherwise, . - public bool CanBeIdle(Player player) => player.IsAlive && !IgnoredPlayers.Contains(player) && !IgnoredRoles.Contains(player.Role) && + public bool CanBeIdle(Player player) => player is not null && player.IsAlive && !IgnoredPlayers.Contains(player) && !IgnoredRoles.Contains(player.Role) && !IgnoredTeams.Contains(player.Role.Team) && IsPlayerInIdleRange(player); /// @@ -292,7 +291,7 @@ public bool CanBeIdle(Player player) => player.IsAlive && !IgnoredPlayers.Contai /// /// The to check. /// if the given can trigger the tesla gate; otherwise, . - public bool CanBeTriggered(Player player) => !IgnoredPlayers.Contains(player) && !IgnoredRoles.Contains(player.Role) && + public bool CanBeTriggered(Player player) => player is not null && player.IsAlive && !IgnoredPlayers.Contains(player) && !IgnoredRoles.Contains(player.Role) && !IgnoredTeams.Contains(player.Role.Team) && IsPlayerInTriggerRange(player); } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Warhead.cs b/Exiled.API/Features/Warhead.cs index 0c45e606c7..1ff8acd9bc 100644 --- a/Exiled.API/Features/Warhead.cs +++ b/Exiled.API/Features/Warhead.cs @@ -20,10 +20,7 @@ namespace Exiled.API.Features /// public static class Warhead { - /// - /// A containing all . - /// - internal static readonly List InternalBlastDoors = new(); + private static AlphaWarheadOutsitePanel alphaWarheadOutsitePanel; /// /// Gets the cached component. @@ -38,7 +35,7 @@ public static class Warhead /// /// Gets the cached component. /// - public static AlphaWarheadOutsitePanel OutsitePanel { get; internal set; } + public static AlphaWarheadOutsitePanel OutsitePanel => alphaWarheadOutsitePanel != null ? alphaWarheadOutsitePanel : (alphaWarheadOutsitePanel = Object.FindObjectOfType()); /// /// Gets the of the warhead lever. @@ -66,16 +63,7 @@ public static bool OpenDoors /// /// Gets all of the warhead blast doors. /// - public static IReadOnlyCollection BlastDoors - { - get - { - if (InternalBlastDoors.Count == 0) - InternalBlastDoors.AddRange(Object.FindObjectsOfType()); - - return InternalBlastDoors.AsReadOnly(); - } - } + public static IReadOnlyCollection BlastDoors => BlastDoor.Instances; /// /// Gets or sets a value indicating whether or not the warhead lever is enabled. @@ -138,12 +126,7 @@ public static WarheadStatus Status public static float DetonationTimer { get => AlphaWarheadController.TimeUntilDetonation; - set - { - Controller.Info.StartTime = NetworkTime.time; - Controller.CurScenario.TimeToDetonate = (int)value; - Controller.CurScenario.AdditionalTime = 0; - } + set => Controller.ForceTime(value); } /// @@ -212,4 +195,4 @@ public static void Start() /// Whether or not the given position is prone to being detonated. public static bool CanBeDetonated(Vector3 pos, bool includeOnlyLifts = false) => AlphaWarheadController.CanBeDetonated(pos, includeOnlyLifts); } -} \ No newline at end of file +} diff --git a/Exiled.API/Features/Window.cs b/Exiled.API/Features/Window.cs index 5515517803..961fbab887 100644 --- a/Exiled.API/Features/Window.cs +++ b/Exiled.API/Features/Window.cs @@ -12,10 +12,9 @@ namespace Exiled.API.Features using System.Linq; using DamageHandlers; - using Enums; + using Exiled.API.Features.Doors; using Exiled.API.Interfaces; - using UnityEngine; /// @@ -32,18 +31,23 @@ public class Window : IWrapper, IWorldSpace /// Initializes a new instance of the class. /// /// The base for this door. - public Window(BreakableWindow window) + /// The for this window. + internal Window(BreakableWindow window, Room room) { BreakableWindowToWindow.Add(window, this); Base = window; - Room = window.GetComponentInParent(); + Room = room; Type = GetGlassType(); +#if Debug + if (Type is GlassType.Unknown) + Log.Error($"[GLASSTYPE UNKNOWN] {this}"); +#endif } /// /// Gets a of which contains all the instances. /// - public static IEnumerable List => BreakableWindowToWindow.Values; + public static IReadOnlyCollection List => BreakableWindowToWindow.Values; /// /// Gets the base-game for this window. @@ -150,7 +154,7 @@ public Player LastAttacker /// A wrapper object. public static Window Get(BreakableWindow breakableWindow) => BreakableWindowToWindow.TryGetValue(breakableWindow, out Window window) ? window - : new(breakableWindow); + : new(breakableWindow, breakableWindow.GetComponentInParent()); /// /// Gets a of filtered based on a predicate. diff --git a/Exiled.API/Interfaces/IDamageableDoor.cs b/Exiled.API/Interfaces/IDamageableDoor.cs new file mode 100644 index 0000000000..63425ba4e9 --- /dev/null +++ b/Exiled.API/Interfaces/IDamageableDoor.cs @@ -0,0 +1,57 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Interfaces +{ + using Interactables.Interobjects.DoorUtils; + + /// + /// Interface for doors which can be damaged. + /// + public interface IDamageableDoor + { + /// + /// Gets or sets remaining health of the door. + /// + public float Health { get; set; } + + /// + /// Gets or sets max health of the door. + /// + public float MaxHealth { get; set; } + + /// + /// Gets or sets a value indicating whether or not door is destroyed. + /// + public bool IsDestroyed { get; set; } + + /// + /// Gets a value indicating whether or not this door is breakable. + /// + public bool IsBreakable { get; } + + /// + /// Gets or sets damage types which will be ignored. + /// + public DoorDamageType IgnoredDamage { get; set; } + + /// + /// Damages the door. + /// + /// Amount to be dealt. + /// Damage type. Some types can be ignored. + /// if door was damaged. Otherwise, false. + public bool Damage(float amount, DoorDamageType damageType = DoorDamageType.ServerCommand); + + /// + /// Breaks the specified door. No effect if the door cannot be broken, or if it is already broken. + /// + /// The to apply to the door. + /// if the door was broken, if it was unable to be broken, or was already broken before. + public bool Break(DoorDamageType type = DoorDamageType.ServerCommand); + } +} \ No newline at end of file diff --git a/Exiled.API/Interfaces/INonInteractableDoor.cs b/Exiled.API/Interfaces/INonInteractableDoor.cs new file mode 100644 index 0000000000..1f2433d261 --- /dev/null +++ b/Exiled.API/Interfaces/INonInteractableDoor.cs @@ -0,0 +1,25 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.API.Interfaces +{ + /// + /// Represents an interface for all non-interactable doors. + /// + public interface INonInteractableDoor + { + /// + /// Gets or sets a value indicating whether or not door should ignore lockdowns. + /// + public bool IgnoreLockdowns { get; set; } + + /// + /// Gets or sets a value indicating whether or not door should ignore RA requests. + /// + public bool IgnoreRemoteAdmin { get; set; } + } +} \ No newline at end of file diff --git a/Exiled.CreditTags/CreditTags.cs b/Exiled.CreditTags/CreditTags.cs index 68b9d8c5f0..aecb1b758e 100644 --- a/Exiled.CreditTags/CreditTags.cs +++ b/Exiled.CreditTags/CreditTags.cs @@ -53,6 +53,7 @@ private CreditTags() [RankType.PluginDev] = new Rank("Exiled Plugin Developer", "crimson", "DC143C"), [RankType.TournamentParticipant] = new Rank("Exiled Tournament Participant", "pink", "FF96DE"), [RankType.TournamentChampion] = new Rank("Exiled Tournament Champion", "deep_pink", "FF1493"), + [RankType.Donator] = new Rank("EXILED Supporter", "army_green", "4B5320"), }; /// diff --git a/Exiled.CreditTags/Enums/RankKind.cs b/Exiled.CreditTags/Enums/RankKind.cs index e4d18dd040..e387b22322 100644 --- a/Exiled.CreditTags/Enums/RankKind.cs +++ b/Exiled.CreditTags/Enums/RankKind.cs @@ -41,5 +41,10 @@ public enum RankType /// EXILED Tournament Champion. /// TournamentChampion = 5, + + /// + /// EXILED Donator. + /// + Donator = 6, } } \ No newline at end of file diff --git a/Exiled.CustomItems/API/EventArgs/OwnerEscapingEventArgs.cs b/Exiled.CustomItems/API/EventArgs/OwnerEscapingEventArgs.cs index d7c131f8e4..3c224754e5 100644 --- a/Exiled.CustomItems/API/EventArgs/OwnerEscapingEventArgs.cs +++ b/Exiled.CustomItems/API/EventArgs/OwnerEscapingEventArgs.cs @@ -7,6 +7,9 @@ namespace Exiled.CustomItems.API.EventArgs { + using System.Collections.Generic; + + using Exiled.API.Enums; using Exiled.API.Features; using Exiled.API.Features.Items; using Exiled.CustomItems.API.Features; @@ -14,6 +17,8 @@ namespace Exiled.CustomItems.API.EventArgs using PlayerRoles; + using Respawning; + /// /// Contains all information of a before a escapes. /// @@ -25,7 +30,7 @@ public class OwnerEscapingEventArgs : EscapingEventArgs /// /// The instance. public OwnerEscapingEventArgs(Item item, EscapingEventArgs ev) - : this(item, ev.Player, ev.NewRole) + : this(item, ev.Player, ev.NewRole, ev.EscapeScenario, ev.RespawnTickets) { } @@ -35,8 +40,10 @@ public OwnerEscapingEventArgs(Item item, EscapingEventArgs ev) /// /// /// - public OwnerEscapingEventArgs(Item item, Player player, RoleTypeId newRole) - : base(player, newRole) + /// + /// + public OwnerEscapingEventArgs(Item item, Player player, RoleTypeId newRole, EscapeScenario escapeScenario, KeyValuePair respawnTickets = default) + : base(player, newRole, escapeScenario, respawnTickets) { Item = item; } diff --git a/Exiled.CustomItems/API/Features/CustomArmor.cs b/Exiled.CustomItems/API/Features/CustomArmor.cs index 2398ed77b4..b41051f12e 100644 --- a/Exiled.CustomItems/API/Features/CustomArmor.cs +++ b/Exiled.CustomItems/API/Features/CustomArmor.cs @@ -70,7 +70,7 @@ public override void Give(Player player, bool displayMessage = true) TrackedSerials.Add(armor.Serial); - Timing.CallDelayed(0.05f, () => OnAcquired(player)); + Timing.CallDelayed(0.05f, () => OnAcquired(player, armor, displayMessage)); if (displayMessage) ShowPickedUpMessage(player); diff --git a/Exiled.CustomItems/API/Features/CustomGrenade.cs b/Exiled.CustomItems/API/Features/CustomGrenade.cs index 22fdca5891..d488d10c6e 100644 --- a/Exiled.CustomItems/API/Features/CustomGrenade.cs +++ b/Exiled.CustomItems/API/Features/CustomGrenade.cs @@ -11,10 +11,21 @@ namespace Exiled.CustomItems.API.Features using Exiled.API.Extensions; using Exiled.API.Features; + using Exiled.API.Features.Items; + using Exiled.API.Features.Pickups; using Exiled.API.Features.Pickups.Projectiles; + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Map; using Exiled.Events.EventArgs.Player; + using Footprinting; + using InventorySystem.Items; + using InventorySystem.Items.Pickups; + using InventorySystem.Items.ThrowableProjectiles; + using Mirror; + using UnityEngine; + + using Object = UnityEngine.Object; using Server = Exiled.API.Features.Server; /// @@ -47,6 +58,48 @@ public override ItemType Type /// public abstract float FuseTime { get; set; } + /// + /// Throw the actual CustomGrenade object. + /// + /// The position to throw at. + /// The amount of force to throw with. + /// The Weight of the Grenade. + /// The FuseTime of the grenade. + /// The of the grenade to spawn. + /// The to count as the thrower of the grenade. + /// The spawned. + public virtual Pickup Throw(Vector3 position, float force, float weight, float fuseTime = 3f, ItemType grenadeType = ItemType.GrenadeHE, Player? player = null) + { + if (player is null) + player = Server.Host; + + player.Role.Is(out FpcRole fpcRole); + var velocity = fpcRole.FirstPersonController.FpcModule.Motor.Velocity; + + Throwable throwable = (Throwable)Item.Create(grenadeType, player); + + ThrownProjectile thrownProjectile = Object.Instantiate(throwable.Base.Projectile, position, throwable.Owner.CameraTransform.rotation); + Transform transform = thrownProjectile.transform; + PickupSyncInfo newInfo = new() + { + ItemId = throwable.Type, + Locked = !throwable.Base._repickupable, + Serial = ItemSerialGenerator.GenerateNext(), + WeightKg = weight, + }; + if (thrownProjectile is TimeGrenade time) + time._fuseTime = fuseTime; + thrownProjectile.NetworkInfo = newInfo; + thrownProjectile.PreviousOwner = new Footprint(throwable.Owner.ReferenceHub); + NetworkServer.Spawn(thrownProjectile.gameObject); + thrownProjectile.InfoReceivedHook(default, newInfo); + if (thrownProjectile.TryGetComponent(out Rigidbody component)) + throwable.Base.PropelBody(component, throwable.Base.FullThrowSettings.StartTorque, ThrowableNetworkHandler.GetLimitedVelocity(velocity), force, throwable.Base.FullThrowSettings.UpwardsFactor); + thrownProjectile.ServerActivate(); + + return Pickup.Get(thrownProjectile); + } + /// /// Checks to see if the grenade is a tracked custom grenade. /// diff --git a/Exiled.CustomItems/API/Features/CustomItem.cs b/Exiled.CustomItems/API/Features/CustomItem.cs index 020c928d24..68abc4679b 100644 --- a/Exiled.CustomItems/API/Features/CustomItem.cs +++ b/Exiled.CustomItems/API/Features/CustomItem.cs @@ -170,20 +170,6 @@ public virtual ItemType Type return typeLookupTable[t]; } - /// - /// Tries to get a with a specific ID. - /// - /// The ID to look for. - /// The found , if not registered. - /// Returns a value indicating whether the was found or not. - [Obsolete("Use TryGet(uint, out CustomItem?) instead.", true)] - public static bool TryGet(int id, out CustomItem? customItem) - { - customItem = Get((uint)id); - - return customItem is not null; - } - /// /// Tries to get a with a specific ID. /// @@ -205,8 +191,9 @@ public static bool TryGet(uint id, out CustomItem? customItem) /// Returns a value indicating whether the was found or not. public static bool TryGet(string name, out CustomItem? customItem) { - if (name is null) - throw new ArgumentNullException(nameof(name)); + customItem = null; + if (string.IsNullOrEmpty(name)) + return false; customItem = uint.TryParse(name, out uint id) ? Get(id) : Get(name); @@ -234,8 +221,9 @@ public static bool TryGet(Type t, out CustomItem? customItem) /// Returns a value indicating whether the has a in their hand or not. public static bool TryGet(Player player, out CustomItem? customItem) { + customItem = null; if (player is null) - throw new ArgumentNullException(nameof(player)); + return false; customItem = Registered?.FirstOrDefault(tempCustomItem => tempCustomItem.Check(player.CurrentItem)); @@ -250,8 +238,9 @@ public static bool TryGet(Player player, out CustomItem? customItem) /// Returns a value indicating whether the has a in their hand or not. public static bool TryGet(Player player, out IEnumerable? customItems) { + customItems = Enumerable.Empty(); if (player is null) - throw new ArgumentNullException(nameof(player)); + return false; customItems = Registered.Where(tempCustomItem => player.Items.Any(tempCustomItem.Check)); @@ -284,26 +273,6 @@ public static bool TryGet(Pickup pickup, out CustomItem? customItem) return customItem is not null; } - /// - /// Tries to spawn a specific at a specific position. - /// - /// The ID of the to spawn. - /// The location to spawn the item. - /// The instance of the . - /// Returns a value indicating whether the was spawned or not. - [Obsolete("Use TrySpawn(uint, Vector3, out Pickup?) instead.", true)] - public static bool TrySpawn(int id, Vector3 position, out Pickup? pickup) - { - pickup = default; - - if (!TryGet((uint)id, out CustomItem? item)) - return false; - - pickup = item?.Spawn(position); - - return true; - } - /// /// Tries to spawn a specific at a specific position. /// @@ -359,24 +328,6 @@ public static bool TryGive(Player player, string name, bool displayMessage = tru return true; } - /// - /// Gives to a specific a specic . - /// - /// The to give the item to. - /// The IDs of the to give. - /// Indicates a value whether will be called when the player receives the or not. - /// Returns a value indicating if the player was given the or not. - [Obsolete("Use TryGive(Player, uint, bool) instead.", true)] - public static bool TryGive(Player player, int id, bool displayMessage = true) - { - if (!TryGet((uint)id, out CustomItem? item)) - return false; - - item?.Give(player, displayMessage); - - return true; - } - /// /// Gives to a specific a specic . /// @@ -774,10 +725,7 @@ public virtual void Give(Player player, Item item, bool displayMessage = true) if (!TrackedSerials.Contains(item.Serial)) TrackedSerials.Add(item.Serial); - if (displayMessage) - ShowPickedUpMessage(player); - - Timing.CallDelayed(0.05f, () => OnAcquired(player)); + Timing.CallDelayed(0.05f, () => OnAcquired(player, item, displayMessage)); } catch (Exception e) { @@ -815,7 +763,14 @@ public virtual void Init() /// /// Called when the item is unregistered. /// - public virtual void Destroy() => UnsubscribeEvents(); + public virtual void Destroy() + { + UnsubscribeEvents(); + + typeLookupTable.Remove(GetType()); + stringLookupTable.Remove(Name); + idLookupTable.Remove(Id); + } /// /// Checks the specified pickup to see if it is a custom item. @@ -904,6 +859,7 @@ protected virtual void SubscribeEvents() Exiled.Events.Handlers.Player.ChangingItem += OnInternalChanging; Exiled.Events.Handlers.Player.Escaping += OnInternalOwnerEscaping; Exiled.Events.Handlers.Player.PickingUpItem += OnInternalPickingUp; + Exiled.Events.Handlers.Player.ItemAdded += OnInternalItemAdded; Exiled.Events.Handlers.Scp914.UpgradingPickup += OnInternalUpgradingPickup; Exiled.Events.Handlers.Server.WaitingForPlayers += OnWaitingForPlayers; Exiled.Events.Handlers.Player.Handcuffing += OnInternalOwnerHandcuffing; @@ -921,6 +877,7 @@ protected virtual void UnsubscribeEvents() Exiled.Events.Handlers.Player.ChangingItem -= OnInternalChanging; Exiled.Events.Handlers.Player.Escaping -= OnInternalOwnerEscaping; Exiled.Events.Handlers.Player.PickingUpItem -= OnInternalPickingUp; + Exiled.Events.Handlers.Player.ItemAdded -= OnInternalItemAdded; Exiled.Events.Handlers.Scp914.UpgradingPickup -= OnInternalUpgradingPickup; Exiled.Events.Handlers.Server.WaitingForPlayers -= OnWaitingForPlayers; Exiled.Events.Handlers.Player.Handcuffing -= OnInternalOwnerHandcuffing; @@ -999,7 +956,11 @@ protected virtual void OnUpgrading(API.EventArgs.UpgradingItemEventArgs ev) /// Called anytime the item enters a player's inventory by any means. /// /// The acquiring the item. - protected virtual void OnAcquired(Player player) => ShowPickedUpMessage(player); + /// The being acquired. + /// Whether or not the Pickup hint should be displayed. + protected virtual void OnAcquired(Player player, Item item, bool displayMessage) + { + } /// /// Clears the lists of item uniqIDs and Pickups since any still in the list will be invalid. @@ -1134,13 +1095,19 @@ private void OnInternalPickingUp(PickingUpItemEventArgs ev) if (!ev.IsAllowed) return; + } - Timing.CallDelayed(0.05f, () => OnAcquired(ev.Player)); + private void OnInternalItemAdded(ItemAddedEventArgs ev) + { + if (!Check(ev.Pickup)) + return; + + OnAcquired(ev.Player, ev.Item, true); } private void OnInternalChanging(ChangingItemEventArgs ev) { - if (!Check(ev.NewItem)) + if (!Check(ev.Item)) { MirrorExtensions.ResyncSyncVar(ev.Player.ReferenceHub.networkIdentity, typeof(NicknameSync), nameof(NicknameSync.Network_displayName)); return; @@ -1162,7 +1129,7 @@ private void OnInternalUpgradingInventoryItem(UpgradingInventoryItemEventArgs ev ev.IsAllowed = false; - OnUpgrading(new API.EventArgs.UpgradingItemEventArgs(ev.Player, ev.Item.Base, ev.KnobSetting)); + OnUpgrading(new UpgradingItemEventArgs(ev.Player, ev.Item.Base, ev.KnobSetting)); } private void OnInternalUpgradingPickup(UpgradingPickupEventArgs ev) diff --git a/Exiled.CustomItems/API/Features/CustomWeapon.cs b/Exiled.CustomItems/API/Features/CustomWeapon.cs index 82f666f617..bd97e36f6d 100644 --- a/Exiled.CustomItems/API/Features/CustomWeapon.cs +++ b/Exiled.CustomItems/API/Features/CustomWeapon.cs @@ -21,8 +21,6 @@ namespace Exiled.CustomItems.API.Features using InventorySystem.Items.Firearms.Attachments.Components; using InventorySystem.Items.Firearms.BasicMessages; - using PlayerRoles; - using UnityEngine; using Firearm = Exiled.API.Features.Items.Firearm; @@ -134,8 +132,7 @@ public override void Give(Player player, bool displayMessage = true) Log.Debug($"{nameof(Give)}: Adding {item.Serial} to tracker."); TrackedSerials.Add(item.Serial); - if (displayMessage) - ShowPickedUpMessage(player); + OnAcquired(player, item, displayMessage); } /// diff --git a/Exiled.CustomItems/CustomItems.cs b/Exiled.CustomItems/CustomItems.cs index 58f6db4c4e..8a8e15b368 100644 --- a/Exiled.CustomItems/CustomItems.cs +++ b/Exiled.CustomItems/CustomItems.cs @@ -10,7 +10,6 @@ namespace Exiled.CustomItems using System; using Exiled.API.Features; - using Exiled.CustomItems.API.Features; using Exiled.CustomItems.Events; using HarmonyLib; @@ -41,7 +40,9 @@ public override void OnEnabled() Exiled.Events.Handlers.Player.ChangingItem += playerHandler.OnChangingItem; harmony = new Harmony($"com.{nameof(CustomItems)}.ExiledTeam-{DateTime.Now.Ticks}"); - harmony.PatchAll(); + GlobalPatchProcessor.PatchAll(harmony, out int failedPatch); + if (failedPatch != 0) + Log.Error($"Patching failed! There are {failedPatch} broken patches."); base.OnEnabled(); } diff --git a/Exiled.CustomItems/Events/PlayerHandler.cs b/Exiled.CustomItems/Events/PlayerHandler.cs index 166f8fbe77..397a90ddcf 100644 --- a/Exiled.CustomItems/Events/PlayerHandler.cs +++ b/Exiled.CustomItems/Events/PlayerHandler.cs @@ -12,8 +12,6 @@ namespace Exiled.CustomItems.Events using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; - using PlayerRoles; - /// /// Handles Player events for the CustomItem API. /// @@ -24,7 +22,7 @@ public void OnChangingItem(ChangingItemEventArgs ev) { if (!ev.IsAllowed) return; - if (CustomItem.TryGet(ev.NewItem, out CustomItem? newItem) && (newItem?.ShouldMessageOnGban ?? false)) + if (CustomItem.TryGet(ev.Item, out CustomItem? newItem) && (newItem?.ShouldMessageOnGban ?? false)) { SpectatorCustomNickname(ev.Player, $"{ev.Player.CustomName} (CustomItem: {newItem.Name})"); } diff --git a/Exiled.CustomItems/Exiled.CustomItems.csproj b/Exiled.CustomItems/Exiled.CustomItems.csproj index 8cb9b0d062..703a8a7c77 100644 --- a/Exiled.CustomItems/Exiled.CustomItems.csproj +++ b/Exiled.CustomItems/Exiled.CustomItems.csproj @@ -21,14 +21,12 @@ - - @@ -38,6 +36,7 @@ + diff --git a/Exiled.CustomRoles/API/Extensions.cs b/Exiled.CustomRoles/API/Extensions.cs index 1a61efaf10..6989b995c9 100644 --- a/Exiled.CustomRoles/API/Extensions.cs +++ b/Exiled.CustomRoles/API/Extensions.cs @@ -10,9 +10,13 @@ namespace Exiled.CustomRoles.API using System; using System.Collections.Generic; using System.Collections.ObjectModel; + using System.Linq; using Exiled.API.Features; using Exiled.CustomRoles.API.Features; + using Exiled.CustomRoles.API.Features.Enums; + + using Utils.NonAllocLINQ; /// /// A collection of API methods. @@ -86,5 +90,19 @@ public static void Unregister(this IEnumerable customRoles) /// /// The to be unregistered. public static void Unregister(this CustomAbility ability) => ability.TryUnregister(); + + /// + /// Gets all s a specific is able to use. + /// + /// The to get abilities for. + /// A of their active abilities, or if none. + public static IEnumerable? GetActiveAbilities(this Player player) => !ActiveAbility.AllActiveAbilities.TryGetValue(player, out HashSet abilities) ? null : abilities; + + /// + /// Gets the 's selected ability. + /// + /// The to check. + /// The the has selected, or . + public static ActiveAbility? GetSelectedAbility(this Player player) => !ActiveAbility.AllActiveAbilities.TryGetValue(player, out HashSet abilities) ? null : abilities.FirstOrDefault(a => a.Check(player, CheckType.Selected)); } } \ No newline at end of file diff --git a/Exiled.CustomRoles/API/Features/ActiveAbility.cs b/Exiled.CustomRoles/API/Features/ActiveAbility.cs index 8d7d54d562..ec663e9e1b 100644 --- a/Exiled.CustomRoles/API/Features/ActiveAbility.cs +++ b/Exiled.CustomRoles/API/Features/ActiveAbility.cs @@ -11,6 +11,7 @@ namespace Exiled.CustomRoles.API.Features using System.Collections.Generic; using Exiled.API.Features; + using Exiled.CustomRoles.API.Features.Enums; using MEC; @@ -21,6 +22,11 @@ namespace Exiled.CustomRoles.API.Features /// public abstract class ActiveAbility : CustomAbility { + /// + /// Gets a containing all players with active abilities, and the abilities they have access to. + /// + public static Dictionary> AllActiveAbilities { get; } = new(); + /// /// Gets or sets how long the ability lasts. /// @@ -49,6 +55,12 @@ public abstract class ActiveAbility : CustomAbility [YamlIgnore] public HashSet ActivePlayers { get; } = new(); + /// + /// Gets all players who have this ability selected. + /// + [YamlIgnore] + public HashSet SelectedPlayers { get; } = new(); + /// /// Uses the ability. /// @@ -75,20 +87,73 @@ public void EndAbility(Player player) AbilityEnded(player); } + /// + /// Selects the ability. + /// + /// The to select the ability. + public void SelectAbility(Player player) + { + if (!SelectedPlayers.Contains(player)) + { + SelectedPlayers.Add(player); + Selected(player); + } + } + + /// + /// Un-Selects the ability. + /// + /// The to un-select the ability. + public void UnSelectAbility(Player player) + { + if (SelectedPlayers.Contains(player)) + { + SelectedPlayers.Remove(player); + if (Check(player, CheckType.Active)) + EndAbility(player); + Unselected(player); + } + } + /// /// Checks if the specified player is using the ability. /// /// The to check. /// True if the player is actively using the ability. - public override bool Check(Player player) => ActivePlayers.Contains(player); + public override bool Check(Player player) => Check(player, CheckType.Active); + + /// + /// Checks if the specified meets certain check criteria. + /// + /// The to check. + /// The type of check to preform. + /// The results of the check. + /// : Checks if the ability is currently active for the player. + /// : Checks if the player has the ability selected. + /// : Checks if the player has the ability. + /// + /// This should never happen unless Joker fucks up. + public virtual bool Check(Player player, CheckType type) + { + bool result = type switch + { + CheckType.Active => ActivePlayers.Contains(player), + CheckType.Selected => SelectedPlayers.Contains(player), + CheckType.Available => Players.Contains(player), + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) + }; + + return result; + } /// /// Checks to see if the ability is usable by the player. /// /// The player to check. /// The response to send to the player. + /// Whether to disallow usage if the ability is not selected. /// True if the ability is usable. - public virtual bool CanUseAbility(Player player, out string response) + public virtual bool CanUseAbility(Player player, out string response, bool selectedOnly = false) { if (CanUseOverride is not null) { @@ -96,6 +161,12 @@ public virtual bool CanUseAbility(Player player, out string response) return CanUseOverride.Invoke(); } + if (selectedOnly && !SelectedPlayers.Contains(player)) + { + response = $"{Name} not selected."; + return false; + } + if (!LastUsed.ContainsKey(player)) { response = string.Empty; @@ -116,6 +187,29 @@ public virtual bool CanUseAbility(Player player, out string response) return false; } + /// + protected override void AbilityAdded(Player player) + { + if (!AllActiveAbilities.ContainsKey(player)) + AllActiveAbilities.Add(player, new()); + + if (!AllActiveAbilities[player].Contains(this)) + AllActiveAbilities[player].Add(this); + base.AbilityAdded(player); + } + + /// + protected override void AbilityRemoved(Player player) + { + if (!AllActiveAbilities.ContainsKey(player)) + return; + + SelectedPlayers.Remove(player); + + AllActiveAbilities[player].Remove(this); + base.AbilityRemoved(player); + } + /// /// Called when the ability is used. /// @@ -138,5 +232,21 @@ protected virtual void AbilityEnded(Player player) /// The using the ability. protected virtual void ShowMessage(Player player) => player.ShowHint(string.Format(CustomRoles.Instance!.Config.UsedAbilityHint.Content, Name, Description), CustomRoles.Instance.Config.UsedAbilityHint.Duration); + + /// + /// Called when the ability is selected. + /// + /// The selecting the ability. + protected virtual void Selected(Player player) + { + } + + /// + /// Called when the ability is un-selected. + /// + /// The un-selecting the ability. + protected virtual void Unselected(Player player) + { + } } } \ No newline at end of file diff --git a/Exiled.CustomRoles/API/Features/CustomAbility.cs b/Exiled.CustomRoles/API/Features/CustomAbility.cs index 167220b4a5..2818c8eef8 100644 --- a/Exiled.CustomRoles/API/Features/CustomAbility.cs +++ b/Exiled.CustomRoles/API/Features/CustomAbility.cs @@ -228,6 +228,7 @@ public static IEnumerable UnregisterAbilities(IEnumerable t /// The to give the ability to. public void AddAbility(Player player) { + Log.Debug($"Added {Name} to {player.Nickname}"); Players.Add(player); AbilityAdded(player); } @@ -238,6 +239,7 @@ public void AddAbility(Player player) /// The to remove this ability from. public void RemoveAbility(Player player) { + Log.Debug($"Removed {Name} from {player.Nickname}"); Players.Remove(player); AbilityRemoved(player); } diff --git a/Exiled.CustomRoles/API/Features/CustomRole.cs b/Exiled.CustomRoles/API/Features/CustomRole.cs index 56cedfefcc..607792611b 100644 --- a/Exiled.CustomRoles/API/Features/CustomRole.cs +++ b/Exiled.CustomRoles/API/Features/CustomRole.cs @@ -26,8 +26,6 @@ namespace Exiled.CustomRoles.API.Features using MEC; - using Mirror; - using PlayerRoles; using UnityEngine; @@ -89,7 +87,7 @@ public abstract class CustomRole /// /// Gets or sets a list of the roles custom abilities. /// - public virtual List CustomAbilities { get; set; } = new(); + public virtual List? CustomAbilities { get; set; } = new(); /// /// Gets or sets the starting inventory for the role. @@ -131,6 +129,11 @@ public abstract class CustomRole /// public virtual float SpawnChance { get; set; } + /// + /// Gets or sets a value indicating whether the spawn system is ignored for this role or not. + /// + public virtual bool IgnoreSpawnSystem { get; set; } + /// /// Gets or sets a value indicating whether players keep this Custom Role when they switch roles: Class-D -> Scientist for example. /// @@ -171,10 +174,6 @@ public abstract class CustomRole /// /// The ID of the role to get. /// The role, or if it doesn't exist. - [Obsolete("Use Get(uint) instead", false)] - public static CustomRole? Get(int id) => Get((uint)id); - - /// public static CustomRole? Get(uint id) { if (!idLookupTable.ContainsKey(id)) @@ -212,17 +211,13 @@ public abstract class CustomRole /// The ID of the role to get. /// The custom role. /// True if the role exists. - [Obsolete("Use TryGet(uint) instead", false)] - public static bool TryGet(int id, out CustomRole? customRole) + public static bool TryGet(uint id, out CustomRole? customRole) { customRole = Get(id); return customRole is not null; } - /// - public static bool TryGet(uint id, out CustomRole? customRole) => TryGet(id, out customRole); - /// /// Tries to get a by name. /// @@ -281,31 +276,39 @@ public static bool TryGet(Player player, out IReadOnlyCollection cus /// Whether or not reflection is skipped (more efficient if you are not using your custom item classes as config objects). /// The class to search properties for, if different from the plugin's config class. /// A of which contains all registered 's. - public static IEnumerable RegisterRoles(bool skipReflection = false, object?overrideClass = null) + public static IEnumerable RegisterRoles(bool skipReflection = false, object? overrideClass = null) => RegisterRoles(skipReflection, overrideClass, true, Assembly.GetCallingAssembly()); + + /// + /// Registers all the 's present in the current assembly. + /// + /// Whether or not reflection is skipped (more efficient if you are not using your custom item classes as config objects). + /// The class to search properties for, if different from the plugin's config class. + /// Whether or not inherited attributes should be taken into account for registration. + /// Assembly which is calling this method. + /// A of which contains all registered 's. + public static IEnumerable RegisterRoles(bool skipReflection = false, object? overrideClass = null, bool inheritAttributes = true, Assembly? assembly = null) { List roles = new(); Log.Warn("Registering roles..."); - Assembly assembly = Assembly.GetCallingAssembly(); + assembly ??= Assembly.GetCallingAssembly(); foreach (Type type in assembly.GetTypes()) { - if (type.BaseType != typeof(CustomRole) && type.GetCustomAttribute(typeof(CustomRoleAttribute)) is null) + if (type.BaseType != typeof(CustomRole) && type.GetCustomAttribute(typeof(CustomRoleAttribute), inheritAttributes) is null) { - Log.Debug($"{type} base: {type.BaseType} -- {type.GetCustomAttribute(typeof(CustomRoleAttribute)) is null}"); + Log.Debug($"{type} base: {type.BaseType} -- {type.GetCustomAttribute(typeof(CustomRoleAttribute), inheritAttributes) is null}"); continue; } - Log.Debug("Getting attributed for {type"); - foreach (Attribute attribute in type.GetCustomAttributes(typeof(CustomRoleAttribute), true).Cast()) + Log.Debug($"Getting attributed for {type}"); + foreach (Attribute attribute in type.GetCustomAttributes(typeof(CustomRoleAttribute), inheritAttributes).Cast()) { CustomRole? customRole = null; - if (!skipReflection && Server.PluginAssemblies.ContainsKey(assembly)) + if (!skipReflection && Server.PluginAssemblies.TryGetValue(assembly, out IPlugin plugin)) { - IPlugin plugin = Server.PluginAssemblies[assembly]; - foreach (PropertyInfo property in overrideClass?.GetType().GetProperties() ?? plugin.Config.GetType().GetProperties()) { if (property.PropertyType != type) @@ -464,7 +467,7 @@ public static void ForceSyncSetPlayerFriendlyFire(CustomRole roleToSync, Player /// /// The to check. /// True if the player has this role. - public virtual bool Check(Player player) => TrackedPlayers.Contains(player); + public virtual bool Check(Player? player) => player is not null && TrackedPlayers.Contains(player); /// /// Initializes this role manager. @@ -509,23 +512,22 @@ public virtual void AddRole(Player player) player.Role.Set(Role, SpawnReason.ForceClass, RoleSpawnFlags.All); } - if (!KeepInventoryOnSpawn) - { - Log.Debug($"{Name}: Clearing {player.Nickname}'s inventory."); - player.ClearInventory(); - } - - foreach (string itemName in Inventory) - { - Log.Debug($"{Name}: Adding {itemName} to inventory."); - TryAddItem(player, itemName); - } + Timing.CallDelayed( + 0.25f, + () => + { + if (!KeepInventoryOnSpawn) + { + Log.Debug($"{Name}: Clearing {player.Nickname}'s inventory."); + player.ClearInventory(); + } - foreach (AmmoType ammo in Ammo.Keys) - { - Log.Debug($"{Name}: Adding {Ammo[ammo]} {ammo} to inventory."); - player.SetAmmo(ammo, Ammo[ammo]); - } + foreach (string itemName in Inventory) + { + Log.Debug($"{Name}: Adding {itemName} to inventory."); + TryAddItem(player, itemName); + } + }); Log.Debug($"{Name}: Setting health values."); player.Health = MaxHealth; @@ -539,8 +541,10 @@ public virtual void AddRole(Player player) } Log.Debug($"{Name}: Setting player info"); - player.CustomInfo = CustomInfo; - player.InfoArea &= ~PlayerInfoArea.Role; + + player.CustomInfo = $"{player.CustomName}\n{CustomInfo}"; + player.InfoArea &= ~(PlayerInfoArea.Role | PlayerInfoArea.Nickname); + if (CustomAbilities is not null) { foreach (CustomAbility ability in CustomAbilities) @@ -583,21 +587,27 @@ public virtual void AddRole(Player player) /// The to remove the role from. public virtual void RemoveRole(Player player) { + if (!TrackedPlayers.Contains(player)) + return; Log.Debug($"{Name}: Removing role from {player.Nickname}"); TrackedPlayers.Remove(player); player.CustomInfo = string.Empty; - player.InfoArea |= PlayerInfoArea.Role; + player.InfoArea |= PlayerInfoArea.Role | PlayerInfoArea.Nickname; player.Scale = Vector3.one; - if (RemovalKillsPlayer) - player.Role.Set(RoleTypeId.Spectator); - foreach (CustomAbility ability in CustomAbilities) + if (CustomAbilities is not null) { - ability.RemoveAbility(player); + foreach (CustomAbility ability in CustomAbilities) + { + ability.RemoveAbility(player); + } } RoleRemoved(player); player.UniqueRole = string.Empty; player.TryRemoveCustomeRoleFriendlyFire(Name); + + if (RemovalKillsPlayer) + player.Role.Set(RoleTypeId.Spectator); } /// @@ -819,9 +829,11 @@ protected Vector3 GetSpawnPosition() protected virtual void SubscribeEvents() { Log.Debug($"{Name}: Loading events."); + Exiled.Events.Handlers.Player.ChangingNickname += OnInternalChangingNickname; Exiled.Events.Handlers.Player.ChangingRole += OnInternalChangingRole; Exiled.Events.Handlers.Player.Spawning += OnInternalSpawning; Exiled.Events.Handlers.Player.SpawningRagdoll += OnSpawningRagdoll; + Exiled.Events.Handlers.Player.Destroying += OnDestroying; } /// @@ -833,9 +845,11 @@ protected virtual void UnsubscribeEvents() RemoveRole(player); Log.Debug($"{Name}: Unloading events."); + Exiled.Events.Handlers.Player.ChangingNickname -= OnInternalChangingNickname; Exiled.Events.Handlers.Player.ChangingRole -= OnInternalChangingRole; Exiled.Events.Handlers.Player.Spawning -= OnInternalSpawning; Exiled.Events.Handlers.Player.SpawningRagdoll -= OnSpawningRagdoll; + Exiled.Events.Handlers.Player.Destroying += OnDestroying; } /// @@ -866,16 +880,43 @@ protected virtual void RoleRemoved(Player player) { } + private void OnInternalChangingNickname(ChangingNicknameEventArgs ev) + { + if (!Check(ev.Player)) + return; + + ev.Player.CustomInfo = $"{ev.NewName}\n{CustomInfo}"; + } + private void OnInternalSpawning(SpawningEventArgs ev) { - if (SpawnChance > 0 && !Check(ev.Player) && ev.Player.Role.Type == Role && Loader.Random.NextDouble() * 100 <= SpawnChance) + if (!IgnoreSpawnSystem && SpawnChance > 0 && !Check(ev.Player) && ev.Player.Role.Type == Role && Loader.Random.NextDouble() * 100 <= SpawnChance) AddRole(ev.Player); } private void OnInternalChangingRole(ChangingRoleEventArgs ev) { if (Check(ev.Player) && ((ev.NewRole == RoleTypeId.Spectator && !KeepRoleOnDeath) || (ev.NewRole != RoleTypeId.Spectator && ev.NewRole != Role && !KeepRoleOnChangingRole))) + { RemoveRole(ev.Player); + } + else if (Check(ev.Player)) + { + if (Ammo.Count > 0) + { + ev.Ammo.Clear(); + Timing.CallDelayed( + 0.5f, + () => + { + foreach (AmmoType type in Enum.GetValues(typeof(AmmoType))) + { + if (type != AmmoType.None) + ev.Player.SetAmmo(type, Ammo.ContainsKey(type) ? Ammo[type] : (ushort)0); + } + }); + } + } } private void OnSpawningRagdoll(SpawningRagdollEventArgs ev) @@ -883,5 +924,7 @@ private void OnSpawningRagdoll(SpawningRagdollEventArgs ev) if (Check(ev.Player)) ev.Role = Role; } + + private void OnDestroying(DestroyingEventArgs ev) => RemoveRole(ev.Player); } } diff --git a/Exiled.CustomRoles/API/Features/Enums/CheckType.cs b/Exiled.CustomRoles/API/Features/Enums/CheckType.cs new file mode 100644 index 0000000000..bbf59087eb --- /dev/null +++ b/Exiled.CustomRoles/API/Features/Enums/CheckType.cs @@ -0,0 +1,30 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.CustomRoles.API.Features.Enums +{ + /// + /// The possible types of checks to preform on active abilities. + /// + public enum CheckType + { + /// + /// Check if the ability is available to the player. (DOES NOT CHECK COOLDOWNS) + /// + Available, + + /// + /// Check if the ability is selected, but not active. + /// + Selected, + + /// + /// The ability is currently active. + /// + Active, + } +} \ No newline at end of file diff --git a/Exiled.CustomRoles/API/Features/Enums/KeypressActivationType.cs b/Exiled.CustomRoles/API/Features/Enums/KeypressActivationType.cs new file mode 100644 index 0000000000..bbb47ebb23 --- /dev/null +++ b/Exiled.CustomRoles/API/Features/Enums/KeypressActivationType.cs @@ -0,0 +1,40 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.CustomRoles.API.Features.Enums +{ + /// + /// The Action type that should be triggered from a keypress trigger. + /// + public enum AbilityKeypressTriggerType + { + /// + /// No action. + /// + None, + + /// + /// Activate ability. + /// + Activate, + + /// + /// Switch to next ability. + /// + SwitchForward, + + /// + /// Switch to previous ability. + /// + SwitchBackward, + + /// + /// Display information about the ability to the user. + /// + DisplayInfo, + } +} \ No newline at end of file diff --git a/Exiled.CustomRoles/API/Features/KeypressActivator.cs b/Exiled.CustomRoles/API/Features/KeypressActivator.cs new file mode 100644 index 0000000000..da2f60f6ba --- /dev/null +++ b/Exiled.CustomRoles/API/Features/KeypressActivator.cs @@ -0,0 +1,190 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.CustomRoles.API.Features +{ + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + using System.Text; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.API.Features.Roles; + using Exiled.CustomRoles.API.Features.Enums; + using Exiled.CustomRoles.API.Features.Interfaces; + using Exiled.Events.EventArgs.Player; + using Exiled.Events.EventArgs.Server; + + using MEC; + + using PlayerRoles.FirstPersonControl; + + /// + /// Control class for keypress ability actions. + /// + internal class KeypressActivator + { + private readonly Dictionary altTracker = DictionaryPool.Pool.Get(); + private readonly Dictionary coroutineTracker = DictionaryPool.Pool.Get(); + + /// + /// Initializes a new instance of the class. + /// + internal KeypressActivator() + { + Exiled.Events.Handlers.Player.TogglingNoClip += OnTogglingNoClip; + Exiled.Events.Handlers.Server.EndingRound += OnEndingRound; + } + + /// + /// Finalizes an instance of the class. + /// + ~KeypressActivator() + { + Exiled.Events.Handlers.Player.TogglingNoClip -= OnTogglingNoClip; + Exiled.Events.Handlers.Server.EndingRound -= OnEndingRound; + DictionaryPool.Pool.Return(altTracker); + DictionaryPool.Pool.Return(coroutineTracker); + } + + private void OnTogglingNoClip(TogglingNoClipEventArgs ev) + { + if (ev.Player.IsNoclipPermitted) + return; + + if (!ActiveAbility.AllActiveAbilities.ContainsKey(ev.Player)) + return; + + if (!altTracker.ContainsKey(ev.Player)) + altTracker.Add(ev.Player, 0); + + altTracker[ev.Player]++; + + if (!coroutineTracker.ContainsKey(ev.Player)) + coroutineTracker.Add(ev.Player, default); + + if (!coroutineTracker[ev.Player].IsRunning) + coroutineTracker[ev.Player] = Timing.RunCoroutine(ProcessAltKey(ev.Player)); + } + + private void OnEndingRound(EndingRoundEventArgs ev) + { + altTracker.Clear(); + foreach (CoroutineHandle handle in coroutineTracker.Values) + Timing.KillCoroutines(handle); + coroutineTracker.Clear(); + } + + private IEnumerator ProcessAltKey(Player player) + { + yield return Timing.WaitForSeconds(0.25f); + + if (!altTracker.TryGetValue(player, out int pressCount)) + yield break; + + Log.Debug($"{player.Nickname}: {pressCount} {(player.Role is FpcRole fpc ? fpc.MoveState : false)}"); + AbilityKeypressTriggerType type = pressCount switch + { + 1 when player.Role is FpcRole { MoveState: PlayerMovementState.Sneaking } => AbilityKeypressTriggerType.DisplayInfo, + 1 => AbilityKeypressTriggerType.Activate, + 2 when player.Role is FpcRole { MoveState: PlayerMovementState.Sneaking } => AbilityKeypressTriggerType.SwitchBackward, + 2 => AbilityKeypressTriggerType.SwitchForward, + _ => AbilityKeypressTriggerType.None, + }; + + player.ShowHint(!PreformAction(player, type, out string response) ? $"Failed to preform action: {response}" : $"Preformed action: {response}", 5f); + altTracker[player] = 0; + } + + private bool PreformAction(Player player, AbilityKeypressTriggerType type, out string response) + { + ActiveAbility? selected = player.GetSelectedAbility(); + if (type == AbilityKeypressTriggerType.Activate) + { + if (selected is null) + { + response = "No selected abilities."; + return false; + } + + if (!selected.CanUseAbility(player, out response, CustomRoles.Instance.Config.ActivateOnlySelected)) + return false; + response = $"{selected.Name} used."; + selected.UseAbility(player); + return true; + } + + if (type is AbilityKeypressTriggerType.SwitchForward or AbilityKeypressTriggerType.SwitchBackward) + { + List abilities = ListPool.Pool.Get(player.GetActiveAbilities()); + + if (abilities.Count == 0) + { + response = "No abilities to switch to."; + return false; + } + + if (selected is not null) + { + int index = abilities.IndexOf(selected); + int mod = type == AbilityKeypressTriggerType.SwitchForward ? 1 : -1; + if (index + mod > abilities.Count - 1) + index = 0; + else if (index + mod < 0) + index = abilities.Count - 1; + else + index += mod; + + if (index < 0 || index > abilities.Count - 1) + { + Log.Warn("Joker can't do math."); + response = "Jokey did a fucky wucky wif his maths"; + return false; + } + + if (abilities.Count <= 1) + { + response = "No abilities to switch to."; + return false; + } + + selected.UnSelectAbility(player); + abilities[index].SelectAbility(player); + response = $"{abilities[index].Name} has been selected."; + return true; + } + + abilities[0].SelectAbility(player); + response = $"{abilities[0].Name} has been selected."; + return true; + } + + if (type == AbilityKeypressTriggerType.DisplayInfo) + { + if (selected is null) + { + response = "No ability selected."; + return false; + } + + StringBuilder builder = StringBuilderPool.Pool.Get(); + builder.AppendLine(selected.Name); + builder.AppendLine(selected.Description); + builder.AppendLine(selected.Duration.ToString(CultureInfo.InvariantCulture)).Append(" (").Append(selected.Cooldown).Append(") ").AppendLine(); + builder.AppendLine($"Usable: ").Append(selected.CanUseAbility(player, out string res)); + if (!string.IsNullOrEmpty(res)) + builder.Append(" [").Append(res).Append("]"); + response = StringBuilderPool.Pool.ToStringReturn(builder); + return true; + } + + response = $"Invalid action: {type}."; + return false; + } + } +} \ No newline at end of file diff --git a/Exiled.CustomRoles/API/Features/Parsers/AbstractClassNodeTypeResolver.cs b/Exiled.CustomRoles/API/Features/Parsers/AbstractClassNodeTypeResolver.cs index 0fae633b93..5a5f78daed 100644 --- a/Exiled.CustomRoles/API/Features/Parsers/AbstractClassNodeTypeResolver.cs +++ b/Exiled.CustomRoles/API/Features/Parsers/AbstractClassNodeTypeResolver.cs @@ -37,7 +37,7 @@ public AbstractClassNodeTypeResolver(INodeDeserializer original, params ITypeDis typeDiscriminators = discriminators; } - /// + /// public bool Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value) { if (!reader.Accept(out MappingStart? mapping)) @@ -69,7 +69,7 @@ public bool Deserialize(IParser reader, Type expectedType, Func events) current = events.First; } - /// + /// public ParsingEvent? Current => current?.Value; - /// + /// public bool MoveNext() { current = current?.Next; diff --git a/Exiled.CustomRoles/Commands/List/Abilities.cs b/Exiled.CustomRoles/Commands/List/Abilities.cs new file mode 100644 index 0000000000..6cf5e8490b --- /dev/null +++ b/Exiled.CustomRoles/Commands/List/Abilities.cs @@ -0,0 +1,58 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.CustomRoles.Commands.List +{ + using System; + using System.Linq; + using System.Text; + + using CommandSystem; + + using Exiled.API.Features.Pools; + using Exiled.CustomRoles.API.Features; + using Exiled.Permissions.Extensions; + + /// + internal sealed class Abilities : ICommand + { + /// + public string Command => "abilities"; + + /// + public string[] Aliases => new[] { "a" }; + + /// + public string Description => "Lists all abilities on the server."; + + /// + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + if (!sender.CheckPermission("customroles.list.abilities")) + { + response = "Permission Denied, required: customroles.list.abilities"; + return false; + } + + if (CustomAbility.Registered.Count == 0) + { + response = "There are no custom abilities currently on this server."; + return false; + } + + StringBuilder builder = StringBuilderPool.Pool.Get().AppendLine(); + + builder.Append("[Registered custom roles (").Append(CustomRole.Registered.Count).AppendLine(")]"); + + foreach (CustomAbility ability in CustomAbility.Registered.OrderBy(r => r.Name)) + builder.Append('[').Append(ability.Name).Append(" (").Append(ability.Description).Append(')').AppendLine("]"); + + response = StringBuilderPool.Pool.ToStringReturn(builder); + return true; + } + } +} \ No newline at end of file diff --git a/Exiled.CustomRoles/Commands/List/List.cs b/Exiled.CustomRoles/Commands/List/List.cs index a17aa1722b..919105a321 100644 --- a/Exiled.CustomRoles/Commands/List/List.cs +++ b/Exiled.CustomRoles/Commands/List/List.cs @@ -39,6 +39,7 @@ private List() public override void LoadGeneratedCommands() { RegisterCommand(Registered.Instance); + RegisterCommand(new Abilities()); } /// diff --git a/Exiled.CustomRoles/Commands/UseAbility.cs b/Exiled.CustomRoles/Commands/UseAbility.cs index 45e73acb10..c43e2f3967 100644 --- a/Exiled.CustomRoles/Commands/UseAbility.cs +++ b/Exiled.CustomRoles/Commands/UseAbility.cs @@ -8,7 +8,7 @@ namespace Exiled.CustomRoles.Commands { using System; - using System.Collections.ObjectModel; + using System.Linq; using CommandSystem; @@ -35,57 +35,44 @@ public class UseAbility : ICommand public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) { Player player = Player.Get((CommandSender)sender); - int abilityNumber = 0; - if (arguments.Count > 0) - int.TryParse(arguments.At(0), out abilityNumber); + string abilityName = string.Empty; + ActiveAbility? ability; - ReadOnlyCollection roles = player.GetCustomRoles(); - if (roles.Count == 0) + if (arguments.Count > 0) { - response = "You do not have any custom roles."; - - return false; - } + foreach (string s in arguments.Skip(1)) + abilityName += s; - if (arguments.Count > 1) - { - CustomRole? role = CustomRole.Get(arguments.At(1)); - if (role is null) + if (!CustomAbility.TryGet(abilityName, out CustomAbility? customAbility) || customAbility is null) { - response = $"The specified role {arguments.At(1)} does not exist."; - + response = $"Ability {abilityName} does not exist."; return false; } - if (role.CustomAbilities.Count >= abilityNumber + 1) + if (customAbility is not ActiveAbility activeAbility) { - if (role.CustomAbilities[abilityNumber] is ActiveAbility active) - { - if (!active.CanUseAbility(player, out response)) - { - return false; - } - - active.UseAbility(player); - response = $"Ability {active.Name} used."; - return true; - } + response = $"{abilityName} is not an active ability."; + return false; } - } - response = "Could not find an ability that was able to be used."; - - foreach (CustomRole customRole in roles) + ability = activeAbility; + } + else { - if (customRole.CustomAbilities.Count < abilityNumber + 1 || !(customRole.CustomAbilities[abilityNumber] is ActiveAbility activeAbility) || !activeAbility.CanUseAbility(player, out response)) - continue; + ability = player.GetSelectedAbility(); + } - activeAbility.UseAbility(player); - response = $"Ability {activeAbility.Name} used."; - return true; + if (ability is null) + { + response = "No selected ability."; + return false; } - return false; + if (!ability.CanUseAbility(player, out response, CustomRoles.Instance.Config.ActivateOnlySelected)) + return false; + response = $"{ability.Name} has been used."; + ability.UseAbility(player); + return true; } } } \ No newline at end of file diff --git a/Exiled.CustomRoles/Config.cs b/Exiled.CustomRoles/Config.cs index 7dccab8900..4524de1657 100644 --- a/Exiled.CustomRoles/Config.cs +++ b/Exiled.CustomRoles/Config.cs @@ -40,5 +40,17 @@ public class Config : IConfig /// [Description("The hint that is shown when someone used a custom ability.")] public Broadcast UsedAbilityHint { get; private set; } = new("Ability {0} has been activated.\n{1}", 5); + + /// + /// Gets or sets a value indicating whether keypress ability activations can be used on the server. + /// + [Description("Whether or not Keypress ability activations will work on the server.")] + public bool UseKeypressActivation { get; set; } = true; + + /// + /// Gets or sets a value indicating whether abilities that are not the keypress primary can still be activated. + /// + [Description("Whether or not abilities that are not selected as the current keypress ability can still be activated.")] + public bool ActivateOnlySelected { get; set; } = true; } } \ No newline at end of file diff --git a/Exiled.CustomRoles/CustomRoles.cs b/Exiled.CustomRoles/CustomRoles.cs index 9e51b833b7..1da6aefbaf 100644 --- a/Exiled.CustomRoles/CustomRoles.cs +++ b/Exiled.CustomRoles/CustomRoles.cs @@ -26,6 +26,7 @@ namespace Exiled.CustomRoles public class CustomRoles : Plugin { private PlayerHandlers? playerHandlers; + private KeypressActivator? keypressActivator; /// /// Initializes a new instance of the class. @@ -46,7 +47,7 @@ public CustomRoles() /// /// Gets a static reference to the plugin's instance. /// - public static CustomRoles? Instance { get; private set; } + public static CustomRoles Instance { get; private set; } = null!; /// /// Gets a list of players to stop spawning ragdolls for. @@ -59,6 +60,8 @@ public override void OnEnabled() Instance = this; playerHandlers = new PlayerHandlers(this); + if (Config.UseKeypressActivation) + keypressActivator = new(); Exiled.Events.Handlers.Player.SpawningRagdoll += playerHandlers.OnSpawningRagdoll; base.OnEnabled(); } @@ -67,6 +70,7 @@ public override void OnEnabled() public override void OnDisabled() { Exiled.Events.Handlers.Player.SpawningRagdoll -= playerHandlers!.OnSpawningRagdoll; + keypressActivator = null; base.OnDisabled(); } } diff --git a/Exiled.CustomRoles/Exiled.CustomRoles.csproj b/Exiled.CustomRoles/Exiled.CustomRoles.csproj index b6942e539e..d569aacb2c 100644 --- a/Exiled.CustomRoles/Exiled.CustomRoles.csproj +++ b/Exiled.CustomRoles/Exiled.CustomRoles.csproj @@ -22,14 +22,12 @@ - - @@ -40,8 +38,10 @@ + + if not "$(EXILED_DEV_REFERENCES)"=="" copy /y "$(OutputPath)$(AssemblyName).dll" "$(EXILED_DEV_REFERENCES)\Plugins\" diff --git a/Exiled.Events/Attributes/EventPatchAttribute.cs b/Exiled.Events/Attributes/EventPatchAttribute.cs new file mode 100644 index 0000000000..0dae925023 --- /dev/null +++ b/Exiled.Events/Attributes/EventPatchAttribute.cs @@ -0,0 +1,39 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Attributes +{ + using System; + + using Exiled.Events.EventArgs.Interfaces; + + /// + /// An attribute to contain data about an event patch. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] + internal class EventPatchAttribute : Attribute + { + private readonly Type handlerType; + private readonly string eventName; + + /// + /// Initializes a new instance of the class. + /// + /// The of the handler class that contains the event. + /// The name of the event. + internal EventPatchAttribute(Type handlerType, string eventName) + { + this.handlerType = handlerType; + this.eventName = eventName; + } + + /// + /// Gets the that will be raised by this patch. + /// + internal IExiledEvent Event => (IExiledEvent)handlerType.GetProperty(eventName)?.GetValue(null); + } +} \ No newline at end of file diff --git a/Exiled.Events/Commands/Config/Merge.cs b/Exiled.Events/Commands/Config/Merge.cs index 57c0b57624..dc90cad8ec 100644 --- a/Exiled.Events/Commands/Config/Merge.cs +++ b/Exiled.Events/Commands/Config/Merge.cs @@ -9,14 +9,12 @@ namespace Exiled.Events.Commands.Config { using System; using System.Collections.Generic; - using System.IO; + using System.Linq; using API.Enums; using API.Features; using API.Interfaces; - using CommandSystem; - using Loader; /// @@ -50,7 +48,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s SortedDictionary configs = ConfigManager.LoadSorted(ConfigManager.Read()); LoaderPlugin.Config.ConfigType = ConfigType.Default; bool haveBeenSaved = ConfigManager.Save(configs); - File.WriteAllText(Paths.LoaderConfig, Loader.Serializer.Serialize(LoaderPlugin.Config)); + PluginAPI.Loader.AssemblyLoader.InstalledPlugins.FirstOrDefault(x => x.PluginName == "Exiled Loader")?.SaveConfig(new LoaderPlugin(), nameof(LoaderPlugin.Config)); response = $"Configs have been merged successfully! Feel free to remove the directory in the following path:\n\"{Paths.IndividualConfigs}\""; return haveBeenSaved; diff --git a/Exiled.Events/Commands/Config/Split.cs b/Exiled.Events/Commands/Config/Split.cs index b2bdb0a336..ab2f1a577c 100644 --- a/Exiled.Events/Commands/Config/Split.cs +++ b/Exiled.Events/Commands/Config/Split.cs @@ -9,14 +9,12 @@ namespace Exiled.Events.Commands.Config { using System; using System.Collections.Generic; - using System.IO; + using System.Linq; using API.Enums; using API.Features; using API.Interfaces; - using CommandSystem; - using Loader; /// @@ -50,7 +48,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s SortedDictionary configs = ConfigManager.LoadSorted(ConfigManager.Read()); LoaderPlugin.Config.ConfigType = ConfigType.Separated; bool haveBeenSaved = ConfigManager.Save(configs); - File.WriteAllText(Paths.LoaderConfig, Loader.Serializer.Serialize(LoaderPlugin.Config)); + PluginAPI.Loader.AssemblyLoader.InstalledPlugins.FirstOrDefault(x => x.PluginName == "Exiled Loader")?.SaveConfig(new LoaderPlugin(), nameof(LoaderPlugin.Config)); response = $"Configs have been merged successfully! Feel free to remove the file in the following path:\n\"{Paths.Config}\""; return haveBeenSaved; diff --git a/Exiled.Events/Commands/PluginManager/Disable.cs b/Exiled.Events/Commands/PluginManager/Disable.cs new file mode 100644 index 0000000000..9e9472f254 --- /dev/null +++ b/Exiled.Events/Commands/PluginManager/Disable.cs @@ -0,0 +1,68 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Commands.PluginManager +{ + using System; + + using API.Interfaces; + using CommandSystem; + using Exiled.Permissions.Extensions; + using RemoteAdmin; + + /// + /// The command to disable a plugin. + /// + public sealed class Disable : ICommand + { + /// + /// Gets static instance of the command. + /// + public static Disable Instance { get; } = new(); + + /// + public string Command { get; } = "disable"; + + /// + public string[] Aliases { get; } = { "ds", "dis" }; + + /// + public string Description { get; } = "Disable a plugin."; + + /// + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + const string perm = "pm.disable"; + + if (!sender.CheckPermission(perm) && sender is PlayerCommandSender playerSender && !playerSender.ServerRoles.RaEverywhere) + { + response = $"You can't disable a plugin, you don't have \"{perm}\" permissions."; + return false; + } + + if (arguments.Count != 1) + { + response = "Please, use: pluginmanager disable "; + return false; + } + + IPlugin plugin = Loader.Loader.GetPlugin(arguments.At(0)); + if (plugin is null) + { + response = "Plugin not enabled or not found."; + return false; + } + + plugin.OnUnregisteringCommands(); + plugin.OnDisabled(); + Loader.Loader.Plugins.Remove(plugin); + Loader.Loader.Locations.Remove(plugin.Assembly); + response = $"Plugin {plugin.Name} has been disabled!"; + return true; + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Commands/PluginManager/Enable.cs b/Exiled.Events/Commands/PluginManager/Enable.cs new file mode 100644 index 0000000000..345d43b7b0 --- /dev/null +++ b/Exiled.Events/Commands/PluginManager/Enable.cs @@ -0,0 +1,94 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Commands.PluginManager +{ + using System; + using System.IO; + using System.Linq; + using System.Reflection; + + using API.Interfaces; + using CommandSystem; + using Exiled.API.Features; + using Exiled.Permissions.Extensions; + using RemoteAdmin; + + /// + /// The command to enable a plugin. + /// + public sealed class Enable : ICommand + { + /// + /// Gets static instance of the command. + /// + public static Enable Instance { get; } = new(); + + /// + public string Command { get; } = "enable"; + + /// + public string[] Aliases { get; } = { "e", "en" }; + + /// + public string Description { get; } = "Enable a plugin"; + + /// + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + const string perm = "pm.enable"; + + if (!sender.CheckPermission(perm) && sender is PlayerCommandSender playerSender && !playerSender.ServerRoles.RaEverywhere) + { + response = $"You can't enable a plugin, you don't have \"{perm}\" permissions."; + return false; + } + + if (arguments.Count != 1) + { + response = "Please, use: pluginmanager enable "; + return false; + } + + string assemblyPath = Path.Combine(Paths.Plugins, $"{arguments.At(0)}.dll"); + Assembly assembly = Loader.Loader.LoadAssembly(assemblyPath); + if (assembly is null) + { + response = "Plugin not found."; + return false; + } + + if (Loader.Loader.Plugins.Any(pl => pl.Assembly == assembly)) + { + response = "plugin already enabled"; + return false; + } + + Loader.Loader.Locations[assembly] = assemblyPath; + + IPlugin plugin = Loader.Loader.CreatePlugin(assembly); + if (plugin is null) + { + response = "Plugin is null, skipping."; + return false; + } + + AssemblyInformationalVersionAttribute attribute = plugin.Assembly.GetCustomAttribute(); + + Log.Info($"Loaded plugin {plugin.Name}@{(plugin.Version is not null ? $"{plugin.Version.Major}.{plugin.Version.Minor}.{plugin.Version.Build}" : attribute is not null ? attribute.InformationalVersion : string.Empty)}"); + + Server.PluginAssemblies.Add(assembly, plugin); + if (plugin.Config.Debug) + Log.DebugEnabled.Add(assembly); + Loader.Loader.Plugins.Add(plugin); + plugin.OnEnabled(); + plugin.OnRegisteringCommands(); + response = $"Plugin {plugin.Name} has been enabled!"; + return true; + } + } +} diff --git a/Exiled.Events/Commands/PluginManager/Patches.cs b/Exiled.Events/Commands/PluginManager/Patches.cs new file mode 100644 index 0000000000..b8249b7def --- /dev/null +++ b/Exiled.Events/Commands/PluginManager/Patches.cs @@ -0,0 +1,74 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Commands.PluginManager +{ + using System; + using System.Linq; + using System.Text; + + using CommandSystem; + + using Exiled.Events.Features; + using Exiled.Permissions.Extensions; + + using NorthwoodLib.Pools; + + using RemoteAdmin; + + /// + /// The command to show all plugins. + /// + public sealed class Patches : ICommand + { + /// + /// Gets static instance of the command. + /// + public static Patches Instance { get; } = new(); + + /// + public string Command { get; } = "patches"; + + /// + public string[] Aliases { get; } = { "patched" }; + + /// + public string Description { get; } = "Returns information about all patches (whether they are patched or not)"; + + /// + public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) + { + const string perm = "ee.showpatches"; + if (!sender.CheckPermission(perm) && (sender is PlayerCommandSender playerSender)) + { + response = $"You can't show the unpatched patches, you don't have \"{perm}\" permissions."; + return false; + } + + StringBuilder sb = StringBuilderPool.Shared.Rent(); + + sb.AppendLine("All patches:"); + sb.AppendLine("Patched:"); + + foreach (Type patch in Patcher.GetAllPatchTypes().Where((type) => !Patcher.UnpatchedTypes.Contains(type))) + { + sb.AppendLine($"\t{patch.FullName}"); + } + + sb.AppendLine("Unpatched: "); + + foreach (Type patch in Patcher.UnpatchedTypes) + { + sb.AppendLine($"\t{patch.FullName}"); + } + + response = sb.ToString(); + StringBuilderPool.Shared.Return(sb); + return true; + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Commands/Show/Show.cs b/Exiled.Events/Commands/PluginManager/PluginManager.cs similarity index 51% rename from Exiled.Events/Commands/Show/Show.cs rename to Exiled.Events/Commands/PluginManager/PluginManager.cs index 0c40f53dfe..fb26f66583 100644 --- a/Exiled.Events/Commands/Show/Show.cs +++ b/Exiled.Events/Commands/PluginManager/PluginManager.cs @@ -1,48 +1,54 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // // ----------------------------------------------------------------------- -namespace Exiled.Events.Commands.Show +namespace Exiled.Events.Commands.PluginManager { using System; using CommandSystem; /// - /// The command to show all plugins. + /// The plugin manager. /// [CommandHandler(typeof(RemoteAdminCommandHandler))] [CommandHandler(typeof(GameConsoleCommandHandler))] - public sealed class Show : ParentCommand + public class PluginManager : ParentCommand { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public Show() + public PluginManager() { LoadGeneratedCommands(); } /// - public override string Command { get; } = "show"; + public override string Command { get; } = "pluginmanager"; /// - public override string[] Aliases { get; } = Array.Empty(); + public override string[] Aliases { get; } = new[] { "plymanager", "plmanager", "pmanager", "plym" }; /// - public override string Description { get; } = "Show plugins"; + public override string Description { get; } = "Manage plugin. Enable, disable and show plugins."; /// - public override void LoadGeneratedCommands() => RegisterCommand(new Plugins()); + public override void LoadGeneratedCommands() + { + RegisterCommand(Show.Instance); + RegisterCommand(Enable.Instance); + RegisterCommand(Disable.Instance); + RegisterCommand(Patches.Instance); + } /// protected override bool ExecuteParent(ArraySegment arguments, ICommandSender sender, out string response) { - response = "Please, specify a valid subcommand! Available: plugins"; + response = "Please, specify a valid subcommand! Available ones: enable, disable, show"; return false; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/Commands/Show/Plugins.cs b/Exiled.Events/Commands/PluginManager/Show.cs similarity index 86% rename from Exiled.Events/Commands/Show/Plugins.cs rename to Exiled.Events/Commands/PluginManager/Show.cs index da52600770..071230c584 100644 --- a/Exiled.Events/Commands/Show/Plugins.cs +++ b/Exiled.Events/Commands/PluginManager/Show.cs @@ -1,11 +1,11 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // // ----------------------------------------------------------------------- -namespace Exiled.Events.Commands.Show +namespace Exiled.Events.Commands.PluginManager { using System; using System.Collections.Generic; @@ -24,13 +24,18 @@ namespace Exiled.Events.Commands.Show /// /// The command to show all plugins. /// - public sealed class Plugins : ICommand + public sealed class Show : ICommand { + /// + /// Gets static instance of the command. + /// + public static Show Instance { get; } = new(); + /// - public string Command { get; } = "plugins"; + public string Command { get; } = "show"; /// - public string[] Aliases { get; } = { "sp", "showplugins" }; + public string[] Aliases { get; } = { "shw", "sh" }; /// public string Description { get; } = "Get all plugins, names, authors and versions"; @@ -38,7 +43,7 @@ public sealed class Plugins : ICommand /// public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) { - const string perm = "ee.showplugins"; + const string perm = "pm.showplugins"; if (!sender.CheckPermission(perm) && sender is PlayerCommandSender playerSender && !playerSender.ServerRoles.RaEverywhere) { diff --git a/Exiled.Events/Commands/Reload/Configs.cs b/Exiled.Events/Commands/Reload/Configs.cs index 1396e7a299..81ab11e792 100644 --- a/Exiled.Events/Commands/Reload/Configs.cs +++ b/Exiled.Events/Commands/Reload/Configs.cs @@ -48,16 +48,18 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s bool haveBeenReloaded = ConfigManager.Reload(); Handlers.Server.OnReloadedConfigs(); - API.Features.Log.KnownDebugValues.Clear(); + API.Features.Log.DebugEnabled.Clear(); foreach (IPlugin plugin in Loader.Plugins) { plugin.OnUnregisteringCommands(); plugin.OnRegisteringCommands(); + if (plugin.Config.Debug) + API.Features.Log.DebugEnabled.Add(plugin.Assembly); } response = "Plugin configs have been reloaded successfully!"; return haveBeenReloaded; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/Config.cs b/Exiled.Events/Config.cs index 605c63e94c..f48f75395d 100644 --- a/Exiled.Events/Config.cs +++ b/Exiled.Events/Config.cs @@ -20,6 +20,12 @@ public sealed class Config : IConfig /// public bool Debug { get; set; } + /// + /// Gets or sets a value indicating whether events are only patched if they have delegates subscribed to them. + /// + [Description("Indicates whether events are patched only if they have delegates subscribed to them")] + public bool UseDynamicPatching { get; set; } = true; + /// /// Gets or sets a value indicating whether SCP-173 can be blocked or not by the tutorial. /// @@ -38,6 +44,12 @@ public sealed class Config : IConfig [Description("Indicates whether SCP-049 can sense tutorial players or not")] public bool CanScp049SenseTutorial { get; set; } = true; + /// + /// Gets or sets a value indicating whether tutorial is affected by SCP-079 scan. + /// + [Description("Indicates whether tutorial is affected by SCP-079 scan.")] + public bool TutorialNotAffectedByScp079Scan { get; set; } = false; + /// /// Gets or sets a value indicating whether flashbangs flash original thrower. /// @@ -45,9 +57,9 @@ public sealed class Config : IConfig public bool CanFlashbangsAffectThrower { get; set; } = true; /// - /// Gets or sets a value indicating whether the name tracking is enabled or not. + /// Gets or sets a value indicating whether the name tracking (invisible EXILED version string added to the end of the server name) is enabled or not. /// - [Description("Indicates whether the name tracking is enabled or not")] + [Description("Indicates whether the name tracking (invisible EXILED version string added to the end of the server name) is enabled or not")] public bool IsNameTrackingEnabled { get; set; } = true; /// diff --git a/Exiled.Events/EventArgs/Interfaces/IDoorEvent.cs b/Exiled.Events/EventArgs/Interfaces/IDoorEvent.cs index 7697be1455..b1060d6033 100644 --- a/Exiled.Events/EventArgs/Interfaces/IDoorEvent.cs +++ b/Exiled.Events/EventArgs/Interfaces/IDoorEvent.cs @@ -7,15 +7,15 @@ namespace Exiled.Events.EventArgs.Interfaces { - using API.Features; + using Exiled.API.Features.Doors; /// - /// Event args used for all related events. + /// Event args used for all related events. /// public interface IDoorEvent : IExiledEvent { /// - /// Gets the triggering the event. + /// Gets the triggering the event. /// public Door Door { get; } } diff --git a/Exiled.Events/EventArgs/Interfaces/IFirearmEvent.cs b/Exiled.Events/EventArgs/Interfaces/IFirearmEvent.cs index fb2c942bd9..0fdb3f4a4f 100644 --- a/Exiled.Events/EventArgs/Interfaces/IFirearmEvent.cs +++ b/Exiled.Events/EventArgs/Interfaces/IFirearmEvent.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.EventArgs.Interfaces /// /// Event args used for all related events. /// - public interface IFirearmEvent : IExiledEvent + public interface IFirearmEvent : IItemEvent { /// /// Gets the triggering the event. diff --git a/Exiled.Events/EventArgs/Interfaces/IHazardEvent.cs b/Exiled.Events/EventArgs/Interfaces/IHazardEvent.cs index 4a18b4e562..54f6a3f74a 100644 --- a/Exiled.Events/EventArgs/Interfaces/IHazardEvent.cs +++ b/Exiled.Events/EventArgs/Interfaces/IHazardEvent.cs @@ -7,16 +7,16 @@ namespace Exiled.Events.EventArgs.Interfaces { - using Hazards; + using Exiled.API.Features.Hazards; /// - /// Event args for all related events. + /// Event args for all related events. /// public interface IHazardEvent : IExiledEvent { /// /// Gets the environmental hazard that the player is interacting with. /// - public EnvironmentalHazard EnvironmentalHazard { get; } + public Hazard Hazard { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp0492Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp0492Event.cs new file mode 100644 index 0000000000..3a01e27306 --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp0492Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp0492Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp0492Role Scp0492 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp049Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp049Event.cs new file mode 100644 index 0000000000..b397c05e83 --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp049Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp049Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp049Role Scp049 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp079Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp079Event.cs new file mode 100644 index 0000000000..df91d55e54 --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp079Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp079Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp079Role Scp079 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp096Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp096Event.cs new file mode 100644 index 0000000000..d742c5b8a2 --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp096Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp096Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp096Role Scp096 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp106Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp106Event.cs new file mode 100644 index 0000000000..32d3971b6c --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp106Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp106Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp106Role Scp106 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp173Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp173Event.cs new file mode 100644 index 0000000000..7358e66d2d --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp173Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp173Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp173Role Scp173 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IScp939Event.cs b/Exiled.Events/EventArgs/Interfaces/IScp939Event.cs new file mode 100644 index 0000000000..fd4801ef6b --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IScp939Event.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Roles; + + /// + /// Event args used for all related events. + /// + public interface IScp939Event : IPlayerEvent + { + /// + /// Gets the triggering the event. + /// + public Scp939Role Scp939 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Interfaces/IUsableEvent.cs b/Exiled.Events/EventArgs/Interfaces/IUsableEvent.cs new file mode 100644 index 0000000000..9821c29f53 --- /dev/null +++ b/Exiled.Events/EventArgs/Interfaces/IUsableEvent.cs @@ -0,0 +1,23 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces +{ + using API.Features; + using Exiled.API.Features.Items; + + /// + /// Event args used for all related events. + /// + public interface IUsableEvent : IItemEvent + { + /// + /// Gets the triggering the event. + /// + public Usable Usable { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Item/ChangingAmmoEventArgs.cs b/Exiled.Events/EventArgs/Item/ChangingAmmoEventArgs.cs index e63120cabe..ad91cfdec2 100644 --- a/Exiled.Events/EventArgs/Item/ChangingAmmoEventArgs.cs +++ b/Exiled.Events/EventArgs/Item/ChangingAmmoEventArgs.cs @@ -47,6 +47,9 @@ public ChangingAmmoEventArgs(InventorySystem.Items.ItemBase firearm, byte oldAmm /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the old ammo. /// diff --git a/Exiled.Events/EventArgs/Item/ChangingAttachmentsEventArgs.cs b/Exiled.Events/EventArgs/Item/ChangingAttachmentsEventArgs.cs index 885a06b94d..be50fbd8be 100644 --- a/Exiled.Events/EventArgs/Item/ChangingAttachmentsEventArgs.cs +++ b/Exiled.Events/EventArgs/Item/ChangingAttachmentsEventArgs.cs @@ -83,6 +83,9 @@ public ChangingAttachmentsEventArgs( /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the who's changing attachments. /// diff --git a/Exiled.Events/EventArgs/Item/KeycardInteractingEventArgs.cs b/Exiled.Events/EventArgs/Item/KeycardInteractingEventArgs.cs index 8d09822d88..bdf36d1790 100644 --- a/Exiled.Events/EventArgs/Item/KeycardInteractingEventArgs.cs +++ b/Exiled.Events/EventArgs/Item/KeycardInteractingEventArgs.cs @@ -8,9 +8,9 @@ namespace Exiled.Events.EventArgs.Item { using Exiled.API.Features; + using Exiled.API.Features.Doors; using Exiled.API.Features.Pickups; using Exiled.Events.EventArgs.Interfaces; - using Interactables.Interobjects.DoorUtils; using BaseKeycardPickup = InventorySystem.Items.Keycards.KeycardPickup; @@ -46,7 +46,7 @@ public KeycardInteractingEventArgs(BaseKeycardPickup pickup, Player player, Door public Player Player { get; } /// - /// Gets the instance. + /// Gets the instance. /// public Door Door { get; } diff --git a/Exiled.Events/EventArgs/Map/ChangedIntoGrenadeEventArgs.cs b/Exiled.Events/EventArgs/Map/ChangedIntoGrenadeEventArgs.cs index 8df410ed66..3ba4b9f116 100644 --- a/Exiled.Events/EventArgs/Map/ChangedIntoGrenadeEventArgs.cs +++ b/Exiled.Events/EventArgs/Map/ChangedIntoGrenadeEventArgs.cs @@ -26,8 +26,8 @@ public class ChangedIntoGrenadeEventArgs : IExiledEvent /// The . public ChangedIntoGrenadeEventArgs(TimedGrenadePickup pickup, ThrownProjectile projectile) { - if (pickup is null) - Log.Error($"{nameof(ChangedIntoGrenadeEventArgs)}: Pickup is null!"); + if (pickup is not TimedGrenadePickup) + Log.Error($"{nameof(ChangedIntoGrenadeEventArgs)}: Pickup is not TimedGrenadePickup!"); Pickup = (GrenadePickup)API.Features.Pickups.Pickup.Get(pickup); Projectile = (Projectile)API.Features.Pickups.Pickup.Get(projectile); @@ -47,6 +47,7 @@ public ChangedIntoGrenadeEventArgs(TimedGrenadePickup pickup, ThrownProjectile p /// /// Gets or sets a value indicating how long the fuse of the changed grenade will be. /// - public float FuseTime { get; set; } + // TODO: float + public double FuseTime { get; set; } } } diff --git a/Exiled.Events/EventArgs/Map/ExplodingGrenadeEventArgs.cs b/Exiled.Events/EventArgs/Map/ExplodingGrenadeEventArgs.cs index 88299a85cf..da80b0aa10 100644 --- a/Exiled.Events/EventArgs/Map/ExplodingGrenadeEventArgs.cs +++ b/Exiled.Events/EventArgs/Map/ExplodingGrenadeEventArgs.cs @@ -14,6 +14,9 @@ namespace Exiled.Events.EventArgs.Map using Exiled.API.Features.Pickups.Projectiles; using Exiled.API.Features.Pools; using Exiled.Events.EventArgs.Interfaces; + using Exiled.Events.Patches.Generic; + + using Footprinting; using InventorySystem.Items.ThrowableProjectiles; @@ -31,9 +34,9 @@ public class ExplodingGrenadeEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - public ExplodingGrenadeEventArgs(Player thrower, Vector3 position, EffectGrenade grenade, Collider[] targets) + public ExplodingGrenadeEventArgs(Footprint thrower, Vector3 position, ExplosionGrenade grenade, Collider[] targets) { - Player = thrower ?? Server.Host; + Player = Player.Get(thrower.Hub); Projectile = (EffectGrenadeProjectile)Pickup.Get(grenade); Position = position; TargetsToAffect = ListPool.Pool.Get(); @@ -50,8 +53,29 @@ public ExplodingGrenadeEventArgs(Player thrower, Vector3 position, EffectGrenade if (player is null) continue; - if (!TargetsToAffect.Contains(player)) - TargetsToAffect.Add(player); + switch (Player is null) + { + case false: + { + if (Server.FriendlyFire || IndividualFriendlyFire.CheckFriendlyFirePlayer(player.ReferenceHub, hub)) + { + if (!TargetsToAffect.Contains(player)) + TargetsToAffect.Add(player); + } + } + + break; + case true: + { + if (Server.FriendlyFire || HitboxIdentity.CheckFriendlyFire(thrower.Role, hub.roleManager.CurrentRole.RoleTypeId)) + { + if (!TargetsToAffect.Contains(player)) + TargetsToAffect.Add(player); + } + } + + break; + } } } diff --git a/Exiled.Events/EventArgs/Map/FillingLockerEventArgs.cs b/Exiled.Events/EventArgs/Map/FillingLockerEventArgs.cs new file mode 100644 index 0000000000..f774ac08f1 --- /dev/null +++ b/Exiled.Events/EventArgs/Map/FillingLockerEventArgs.cs @@ -0,0 +1,52 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Map +{ + using Exiled.API.Features.Pickups; + using Exiled.Events.EventArgs.Interfaces; + + using InventorySystem.Items.Pickups; + + using MapGeneration.Distributors; + + /// + /// Contains all information before the server spawns an item in locker. + /// + public class FillingLockerEventArgs : IDeniableEvent, IPickupEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// + /// + /// + public FillingLockerEventArgs(ItemPickupBase pickupBase, LockerChamber lockerChamber) + { + Pickup = Pickup.Get(pickupBase); + LockerChamber = lockerChamber; + } + + /// + /// Gets a value indicating the pickup being spawned. + /// + public Pickup Pickup { get; } + + /// + /// Gets a value indicating the target locker chamber. + /// + public LockerChamber LockerChamber { get; } + + /// + /// Gets or sets a value indicating whether or not the item can be spawned. + /// + public bool IsAllowed { get; set; } = true; + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Map/GeneratorActivatedEventArgs.cs b/Exiled.Events/EventArgs/Map/GeneratorActivatingEventArgs.cs similarity index 81% rename from Exiled.Events/EventArgs/Map/GeneratorActivatedEventArgs.cs rename to Exiled.Events/EventArgs/Map/GeneratorActivatingEventArgs.cs index e123f9799d..ec324f25da 100644 --- a/Exiled.Events/EventArgs/Map/GeneratorActivatedEventArgs.cs +++ b/Exiled.Events/EventArgs/Map/GeneratorActivatingEventArgs.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -16,10 +16,10 @@ namespace Exiled.Events.EventArgs.Map /// /// Contains all information after activating a generator. /// - public class GeneratorActivatedEventArgs : IGeneratorEvent, IDeniableEvent + public class GeneratorActivatingEventArgs : IGeneratorEvent, IDeniableEvent { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// @@ -27,7 +27,7 @@ public class GeneratorActivatedEventArgs : IGeneratorEvent, IDeniableEvent /// /// /// - public GeneratorActivatedEventArgs(Scp079Generator generator, bool isAllowed = true) + public GeneratorActivatingEventArgs(Scp079Generator generator, bool isAllowed = true) { Generator = Generator.Get(generator); IsAllowed = isAllowed; diff --git a/Exiled.Events/EventArgs/Map/PickupAddedEventArgs.cs b/Exiled.Events/EventArgs/Map/PickupAddedEventArgs.cs new file mode 100644 index 0000000000..cfa07259d4 --- /dev/null +++ b/Exiled.Events/EventArgs/Map/PickupAddedEventArgs.cs @@ -0,0 +1,36 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Map +{ + using Exiled.API.Features; + using Exiled.API.Features.Pickups; + using Exiled.Events.EventArgs.Interfaces; + using InventorySystem.Items.Pickups; + + /// + /// Contains all information after the server spawns a pickup. + /// + public class PickupAddedEventArgs : IPickupEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + public PickupAddedEventArgs(ItemPickupBase pickupBase) + { + Pickup = Pickup.Get(pickupBase); + } + + /// + /// Gets a value indicating the pickup being spawned. + /// + public Pickup Pickup { get; } + } +} diff --git a/Exiled.Events/EventArgs/Map/PickupDestroyedEventArgs.cs b/Exiled.Events/EventArgs/Map/PickupDestroyedEventArgs.cs new file mode 100644 index 0000000000..751fc5fba8 --- /dev/null +++ b/Exiled.Events/EventArgs/Map/PickupDestroyedEventArgs.cs @@ -0,0 +1,35 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Map +{ + using Exiled.API.Features.Pickups; + using Exiled.Events.EventArgs.Interfaces; + using InventorySystem.Items.Pickups; + + /// + /// Contains all information after the server destroys a pickup. + /// + public class PickupDestroyedEventArgs : IPickupEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + public PickupDestroyedEventArgs(ItemPickupBase pickupBase) + { + Pickup = Pickup.Get(pickupBase); + } + + /// + /// Gets a value indicating the pickup being destroyed. + /// + public Pickup Pickup { get; } + } +} diff --git a/Exiled.Events/EventArgs/Map/PlacingBulletHole.cs b/Exiled.Events/EventArgs/Map/PlacingBulletHoleEventArgs.cs similarity index 85% rename from Exiled.Events/EventArgs/Map/PlacingBulletHole.cs rename to Exiled.Events/EventArgs/Map/PlacingBulletHoleEventArgs.cs index 893c2f0fa1..6869d87819 100644 --- a/Exiled.Events/EventArgs/Map/PlacingBulletHole.cs +++ b/Exiled.Events/EventArgs/Map/PlacingBulletHoleEventArgs.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -16,10 +16,10 @@ namespace Exiled.Events.EventArgs.Map /// /// Contains all information before placing a bullet hole decal. /// - public class PlacingBulletHole : IPlayerEvent, IDeniableEvent + public class PlacingBulletHoleEventArgs : IPlayerEvent, IDeniableEvent { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// @@ -27,7 +27,7 @@ public class PlacingBulletHole : IPlayerEvent, IDeniableEvent /// /// /// - public PlacingBulletHole(Player owner, RaycastHit hit) + public PlacingBulletHoleEventArgs(Player owner, RaycastHit hit) { Player = owner; Position = hit.point; diff --git a/Exiled.Events/EventArgs/Map/SpawningItemEventArgs.cs b/Exiled.Events/EventArgs/Map/SpawningItemEventArgs.cs index 3eb999d33e..14dffa2999 100644 --- a/Exiled.Events/EventArgs/Map/SpawningItemEventArgs.cs +++ b/Exiled.Events/EventArgs/Map/SpawningItemEventArgs.cs @@ -8,11 +8,10 @@ namespace Exiled.Events.EventArgs.Map { using Exiled.API.Features; + using Exiled.API.Features.Doors; using Exiled.API.Features.Pickups; using Exiled.Events.EventArgs.Interfaces; - using Interactables.Interobjects.DoorUtils; - using InventorySystem.Items.Pickups; /// @@ -55,7 +54,6 @@ public SpawningItemEventArgs(ItemPickupBase pickupBase, bool shouldInitiallySpaw /// /// Works only when is false. /// null when is true. - /// Can be not fully initialized. /// public Door TriggerDoor { get; set; } diff --git a/Exiled.Events/EventArgs/Map/TurningOffLightsEventArgs.cs b/Exiled.Events/EventArgs/Map/TurningOffLightsEventArgs.cs index 4600304958..54ed314bd9 100644 --- a/Exiled.Events/EventArgs/Map/TurningOffLightsEventArgs.cs +++ b/Exiled.Events/EventArgs/Map/TurningOffLightsEventArgs.cs @@ -18,19 +18,19 @@ public class TurningOffLightsEventArgs : IDeniableEvent /// Initializes a new instance of the class. /// /// - /// + /// /// - public TurningOffLightsEventArgs(FlickerableLightController flickerableLightControllerHandler, float duration, bool isAllowed = true) + public TurningOffLightsEventArgs(RoomLightController flickerableLightControllerHandler, float duration, bool isAllowed = true) { - FlickerableLightControllerHandler = flickerableLightControllerHandler; + RoomLightController = flickerableLightControllerHandler; Duration = duration; IsAllowed = isAllowed; } /// - /// Gets the . + /// Gets the . /// - public FlickerableLightController FlickerableLightControllerHandler { get; } + public RoomLightController RoomLightController { get; } /// /// Gets or sets the blackout duration. diff --git a/Exiled.Events/EventArgs/Player/AimingDownSightEventArgs.cs b/Exiled.Events/EventArgs/Player/AimingDownSightEventArgs.cs index 66ab6a7657..7d3ceb4006 100644 --- a/Exiled.Events/EventArgs/Player/AimingDownSightEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/AimingDownSightEventArgs.cs @@ -15,6 +15,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information when a player aims. /// + // TODO: remove stupid AdsIn/AdsOut propetry, and let exists only one public class AimingDownSightEventArgs : IPlayerEvent, IFirearmEvent { /// @@ -23,19 +24,18 @@ public class AimingDownSightEventArgs : IPlayerEvent, IFirearmEvent /// /// /// + /// + /// + /// /// /// /// /// /// /// - public AimingDownSightEventArgs(Player player, bool adsIn, bool adsOut) + public AimingDownSightEventArgs(Player player, Firearm firearm, bool adsIn, bool adsOut) { - if (player?.CurrentItem is Firearm firearm) - Firearm = firearm; - else - Firearm = null; - + Firearm = firearm; Player = player; AdsIn = adsIn; AdsOut = adsOut; @@ -56,6 +56,9 @@ public AimingDownSightEventArgs(Player player, bool adsIn, bool adsOut) /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the player who's triggering the aim action. /// diff --git a/Exiled.Events/EventArgs/Player/CancelledItemUseEventArgs.cs b/Exiled.Events/EventArgs/Player/CancelledItemUseEventArgs.cs new file mode 100644 index 0000000000..e15164a717 --- /dev/null +++ b/Exiled.Events/EventArgs/Player/CancelledItemUseEventArgs.cs @@ -0,0 +1,46 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Player +{ + using API.Features; + using Exiled.API.Features.Items; + using Exiled.Events.EventArgs.Interfaces; + using InventorySystem.Items.Usables; + + /// + /// Contains all information before a player cancels usage of an item. + /// + public class CancelledItemUseEventArgs : IPlayerEvent, IUsableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The player who's stopping the use of an item. + /// + /// + /// + public CancelledItemUseEventArgs(Player player, UsableItem item) + { + Player = player; + Usable = Item.Get(item) is Usable usable ? usable : null; + } + + /// + /// Gets the item that the player cancelling. + /// + public Usable Usable { get; } + + /// + public Item Item => Usable; + + /// + /// Gets the player who cancelling the item. + /// + public Player Player { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/CancellingItemUseEventArgs.cs b/Exiled.Events/EventArgs/Player/CancellingItemUseEventArgs.cs index 03bc1f1aea..8ff04abf26 100644 --- a/Exiled.Events/EventArgs/Player/CancellingItemUseEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/CancellingItemUseEventArgs.cs @@ -8,24 +8,44 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using Exiled.API.Features.Items; + using Exiled.Events.EventArgs.Interfaces; using InventorySystem.Items.Usables; /// - /// Contains all information before a player cancels usage of a medical item. + /// Contains all information before a player cancels usage of an item. /// - public class CancellingItemUseEventArgs : UsingItemEventArgs + public class CancellingItemUseEventArgs : IPlayerEvent, IDeniableEvent, IUsableEvent { /// /// Initializes a new instance of the class. /// - /// The player who's stopping the use of the medical item. + /// The player who's stopping the use of an item. /// /// /// public CancellingItemUseEventArgs(Player player, UsableItem item) - : base(player, item, 0) { + Player = player; + Usable = Item.Get(item) is Usable usable ? usable : null; } + + /// + /// Gets the item that the player cancelling. + /// + public Usable Usable { get; } + + /// + public Item Item => Usable; + + /// + /// Gets the player who cancelling the item. + /// + public Player Player { get; } + + /// + /// Gets or sets a value indicating whether or not the player can cancelling the use of item. + /// + public bool IsAllowed { get; set; } = true; } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ChangedItemEventArgs.cs b/Exiled.Events/EventArgs/Player/ChangedItemEventArgs.cs index a0f33448d7..cda873d1be 100644 --- a/Exiled.Events/EventArgs/Player/ChangedItemEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ChangedItemEventArgs.cs @@ -7,6 +7,8 @@ namespace Exiled.Events.EventArgs.Player { + using System; + using API.Features; using API.Features.Items; @@ -17,7 +19,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information after a player's held item changes. /// - public class ChangedItemEventArgs : IPlayerEvent + public class ChangedItemEventArgs : IPlayerEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -31,7 +33,7 @@ public class ChangedItemEventArgs : IPlayerEvent public ChangedItemEventArgs(Player player, ItemBase oldItem) { Player = player; - NewItem = Player.CurrentItem; + Item = Player.CurrentItem; OldItem = Item.Get(oldItem); } @@ -43,11 +45,17 @@ public ChangedItemEventArgs(Player player, ItemBase oldItem) /// /// Gets the new item. /// - public Item NewItem { get; } + [Obsolete("Use ev.Item instead of this")] + public Item NewItem => Item; + + /// + /// Gets the new item. + /// + public Item Item { get; } /// /// Gets the player who's changed the item. /// public Player Player { get; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Player/ChangingItemEventArgs.cs b/Exiled.Events/EventArgs/Player/ChangingItemEventArgs.cs index aa305b1fe3..de2d78d049 100644 --- a/Exiled.Events/EventArgs/Player/ChangingItemEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ChangingItemEventArgs.cs @@ -19,7 +19,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before a player's held item changes. /// - public class ChangingItemEventArgs : IPlayerEvent, IDeniableEvent + public class ChangingItemEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { private Item newItem; @@ -30,7 +30,7 @@ public class ChangingItemEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - /// + /// /// public ChangingItemEventArgs(Player player, ItemBase newItem) { @@ -41,7 +41,7 @@ public ChangingItemEventArgs(Player player, ItemBase newItem) /// /// Gets or sets the new item. /// - public Item NewItem + public Item Item { get => newItem; set diff --git a/Exiled.Events/EventArgs/Player/ChangingMoveStateEventArgs.cs b/Exiled.Events/EventArgs/Player/ChangingMoveStateEventArgs.cs index 7a4967ad0f..6bbcd0419b 100644 --- a/Exiled.Events/EventArgs/Player/ChangingMoveStateEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ChangingMoveStateEventArgs.cs @@ -7,6 +7,8 @@ namespace Exiled.Events.EventArgs.Player { + using System; + using API.Features; using Interfaces; @@ -37,8 +39,9 @@ public ChangingMoveStateEventArgs(Player player, PlayerMovementState oldState, P { Player = player; OldState = oldState; +#pragma warning disable CS0618 NewState = newState; - IsAllowed = isAllowed; +#pragma warning restore CS0618 } /// @@ -54,11 +57,19 @@ public ChangingMoveStateEventArgs(Player player, PlayerMovementState oldState, P /// /// Gets or sets the new state. /// - public PlayerMovementState NewState { get; set; } + // TODO: remove setter + public PlayerMovementState NewState + { + get; + [Obsolete("Setter was removed due to desync problems.")] + set; + } /// /// Gets or sets a value indicating whether the player can change the movement state. /// - public bool IsAllowed { get; set; } + // TODO: remove + [Obsolete("Property was removed due to desync problems.")] + public bool IsAllowed { get; set; } = true; } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ChangingNicknameEventArgs.cs b/Exiled.Events/EventArgs/Player/ChangingNicknameEventArgs.cs new file mode 100644 index 0000000000..7b971a8202 --- /dev/null +++ b/Exiled.Events/EventArgs/Player/ChangingNicknameEventArgs.cs @@ -0,0 +1,50 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Player +{ + using Exiled.API.Features; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// Contains all information before changing a player's in-game nickname. + /// + public class ChangingNicknameEventArgs : IPlayerEvent, IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The who's name is being changed. + /// The new name to be used. + public ChangingNicknameEventArgs(Player player, string newName) + { + Player = player; + OldName = player.CustomName; + NewName = newName; + } + + /// + /// Gets the 's old name. + /// + public string OldName { get; } + + /// + /// Gets or sets the 's new name. + /// + public string NewName { get; set; } + + /// + /// Gets the who's name is being changed. + /// + public Player Player { get; } + + /// + /// Gets or sets a value indicating whether the event should be allowed. + /// + public bool IsAllowed { get; set; } = true; + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ClosingGeneratorEventArgs.cs b/Exiled.Events/EventArgs/Player/ClosingGeneratorEventArgs.cs index 6dc93fbe2f..f84b38f767 100644 --- a/Exiled.Events/EventArgs/Player/ClosingGeneratorEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ClosingGeneratorEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using Exiled.Events.EventArgs.Interfaces; using MapGeneration.Distributors; /// /// Contains all information before a player closes a generator. /// - public class ClosingGeneratorEventArgs : OpeningGeneratorEventArgs + public class ClosingGeneratorEventArgs : IPlayerEvent, IDeniableEvent, IGeneratorEvent { /// /// Initializes a new instance of the class. @@ -23,8 +23,25 @@ public class ClosingGeneratorEventArgs : OpeningGeneratorEventArgs /// The instance. /// Indicates whether or not the generator can be closed. public ClosingGeneratorEventArgs(Player player, Scp079Generator generator, bool isAllowed = true) - : base(player, generator, isAllowed) { + Player = player; + Generator = Generator.Get(generator); + IsAllowed = isAllowed; } + + /// + /// Gets or sets a value indicating whether or not the generator can be opened. + /// + public bool IsAllowed { get; set; } + + /// + /// Gets the generator that is opening. + /// + public Generator Generator { get; } + + /// + /// Gets the player who's opening the generator. + /// + public Player Player { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/DamagingDoorEventArgs.cs b/Exiled.Events/EventArgs/Player/DamagingDoorEventArgs.cs new file mode 100644 index 0000000000..eac1f0d1b0 --- /dev/null +++ b/Exiled.Events/EventArgs/Player/DamagingDoorEventArgs.cs @@ -0,0 +1,61 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Player +{ + using API.Features; + using API.Features.DamageHandlers; + using Exiled.API.Features.Doors; + using Interactables.Interobjects.DoorUtils; + using Interfaces; + + using AttackerDamageHandler = PlayerStatsSystem.AttackerDamageHandler; + using DamageHandlerBase = PlayerStatsSystem.DamageHandlerBase; + + /// + /// Contains all information before damage is dealt to a . + /// + public class DamagingDoorEventArgs : IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// The damage being dealt. + /// + /// + /// + public DamagingDoorEventArgs(DoorVariant door, float damage, DoorDamageType doorDamageType) + { + Door = Door.Get(door); + Damage = damage; + DamageType = doorDamageType; + } + + /// + /// Gets the object that is damaged. + /// + public Door Door { get; } + + /// + /// Gets or sets the Damage dealt to the door. + /// + public float Damage { get; set; } + + /// + /// Gets or sets a value indicating whether the door can be broken. + /// + public bool IsAllowed { get; set; } = true; + + /// + /// Gets the dealt to the door. + /// + public DoorDamageType DamageType { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/DamagingShootingTargetEventArgs.cs b/Exiled.Events/EventArgs/Player/DamagingShootingTargetEventArgs.cs index 4fb2c98272..698a6cfa80 100644 --- a/Exiled.Events/EventArgs/Player/DamagingShootingTargetEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/DamagingShootingTargetEventArgs.cs @@ -54,7 +54,7 @@ public DamagingShootingTargetEventArgs(Player player, float damage, float distan Amount = damage; Distance = distance; ShootingTarget = ShootingTargetToy.Get(shootingTarget); - Item = player.CurrentItem; + Item = player?.CurrentItem; DamageHandler = (AttackerDamageHandler)damageHandler; HitLocation = hitLocation; IsAllowed = isAllowed; diff --git a/Exiled.Events/EventArgs/Player/DryfiringWeaponEventArgs.cs b/Exiled.Events/EventArgs/Player/DryfiringWeaponEventArgs.cs index 5c5d6f2e01..22e43885e5 100644 --- a/Exiled.Events/EventArgs/Player/DryfiringWeaponEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/DryfiringWeaponEventArgs.cs @@ -23,12 +23,15 @@ public class DryfiringWeaponEventArgs : IPlayerEvent, IFirearmEvent, IDeniableEv /// /// /// + /// + /// + /// /// /// /// - public DryfiringWeaponEventArgs(Player player, bool isAllowed = true) + public DryfiringWeaponEventArgs(Player player, Firearm firearm, bool isAllowed = true) { - Firearm = player.CurrentItem as Firearm; + Firearm = firearm; Player = player; IsAllowed = isAllowed; } @@ -43,6 +46,9 @@ public DryfiringWeaponEventArgs(Player player, bool isAllowed = true) /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the player who's dryfiring the weapon. /// diff --git a/Exiled.Events/EventArgs/Player/DyingEventArgs.cs b/Exiled.Events/EventArgs/Player/DyingEventArgs.cs index 07748b2a42..9dd17324b6 100644 --- a/Exiled.Events/EventArgs/Player/DyingEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/DyingEventArgs.cs @@ -36,7 +36,7 @@ public class DyingEventArgs : IAttackerEvent, IDeniableEvent public DyingEventArgs(Player target, DamageHandlerBase damageHandler) { DamageHandler = new CustomDamageHandler(target, damageHandler); - ItemsToDrop = new List(target.Items.ToList()); + ItemsToDrop = new List(target?.Items?.ToList() ?? new()); Attacker = DamageHandler.BaseIs(out CustomAttackerHandler attackerDamageHandler) ? attackerDamageHandler.Attacker : null; Player = target; } diff --git a/Exiled.Events/EventArgs/Player/EnteringEnvironmentalHazardEventArgs.cs b/Exiled.Events/EventArgs/Player/EnteringEnvironmentalHazardEventArgs.cs index f911612cc5..687ac44c25 100644 --- a/Exiled.Events/EventArgs/Player/EnteringEnvironmentalHazardEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/EnteringEnvironmentalHazardEventArgs.cs @@ -7,8 +7,8 @@ namespace Exiled.Events.EventArgs.Player { + using Exiled.API.Features.Hazards; using Hazards; - using Interfaces; /// @@ -25,7 +25,7 @@ public class EnteringEnvironmentalHazardEventArgs : IPlayerEvent, IDeniableEvent public EnteringEnvironmentalHazardEventArgs(API.Features.Player player, EnvironmentalHazard environmentalHazard, bool isAllowed = true) { Player = player; - EnvironmentalHazard = environmentalHazard; + Hazard = Hazard.Get(environmentalHazard); IsAllowed = isAllowed; } @@ -34,10 +34,8 @@ public EnteringEnvironmentalHazardEventArgs(API.Features.Player player, Environm /// public API.Features.Player Player { get; } - /// - /// Gets the environmental hazard that the player is entering in. - /// - public EnvironmentalHazard EnvironmentalHazard { get; } + /// + public Hazard Hazard { get; } /// /// Gets or sets a value indicating whether or not the player should be affected by the environmental hazard. diff --git a/Exiled.Events/EventArgs/Player/EscapingEventArgs.cs b/Exiled.Events/EventArgs/Player/EscapingEventArgs.cs index 282b148237..a3f6131ee9 100644 --- a/Exiled.Events/EventArgs/Player/EscapingEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/EscapingEventArgs.cs @@ -7,12 +7,16 @@ namespace Exiled.Events.EventArgs.Player { - using API.Features; + using System.Collections.Generic; + using API.Features; + using Exiled.API.Enums; using Interfaces; using PlayerRoles; + using Respawning; + /// /// Contains all information before a player escapes. /// @@ -27,10 +31,61 @@ public class EscapingEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - public EscapingEventArgs(Player player, RoleTypeId newRole) + /// + /// + /// + public EscapingEventArgs(Player player, RoleTypeId newRole, EscapeScenario escapeScenario) { Player = player; NewRole = newRole; + EscapeScenario = escapeScenario; + IsAllowed = escapeScenario is not EscapeScenario.CustomEscape; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public EscapingEventArgs(Player player, RoleTypeId newRole, EscapeScenario escapeScenario, KeyValuePair respawnTickets) + : this(player, newRole, escapeScenario) + { + RespawnTickets = respawnTickets; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// A that will be initialized with. + /// + /// + /// A that will be initialized with. + /// + public EscapingEventArgs(Player player, RoleTypeId newRole, EscapeScenario escapeScenario, SpawnableTeamType teamToGrantTickets, float ticketsToGrant) + : this(player, newRole, escapeScenario) + { + if (teamToGrantTickets != SpawnableTeamType.None) + RespawnTickets = new KeyValuePair(teamToGrantTickets, ticketsToGrant); } /// @@ -43,9 +98,20 @@ public EscapingEventArgs(Player player, RoleTypeId newRole) /// public RoleTypeId NewRole { get; set; } + /// + /// Gets or sets the EscapeScenario that will represent for this player. + /// + public EscapeScenario EscapeScenario { get; set; } + + /// + /// Gets or sets the RespawnTickets that will represent the amount of tickets granted to a specific after the player escapes. + /// + /// + public KeyValuePair RespawnTickets { get; set; } + /// /// Gets or sets a value indicating whether or not the player can escape. /// - public bool IsAllowed { get; set; } = true; + public bool IsAllowed { get; set; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Player/ExitingEnvironmentalHazardEventArgs.cs b/Exiled.Events/EventArgs/Player/ExitingEnvironmentalHazardEventArgs.cs index 21b97d9e2f..7aecd1b3e8 100644 --- a/Exiled.Events/EventArgs/Player/ExitingEnvironmentalHazardEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ExitingEnvironmentalHazardEventArgs.cs @@ -7,8 +7,8 @@ namespace Exiled.Events.EventArgs.Player { + using Exiled.API.Features.Hazards; using Hazards; - using Interfaces; /// @@ -25,7 +25,7 @@ public class ExitingEnvironmentalHazardEventArgs : IPlayerEvent, IDeniableEvent, public ExitingEnvironmentalHazardEventArgs(API.Features.Player player, EnvironmentalHazard environmentalHazard, bool isAllowed = true) { Player = player; - EnvironmentalHazard = environmentalHazard; + Hazard = Hazard.Get(environmentalHazard); IsAllowed = isAllowed; } @@ -34,10 +34,8 @@ public ExitingEnvironmentalHazardEventArgs(API.Features.Player player, Environme /// public API.Features.Player Player { get; } - /// - /// Gets the environmental hazard that the player is exiting from. - /// - public EnvironmentalHazard EnvironmentalHazard { get; } + /// + public Hazard Hazard { get; } /// /// Gets or sets a value indicating whether or not the player should be affected by the environmental hazard. diff --git a/Exiled.Events/EventArgs/Player/FlippingCoinEventArgs.cs b/Exiled.Events/EventArgs/Player/FlippingCoinEventArgs.cs index 23c71fe7a0..34afc7a8ef 100644 --- a/Exiled.Events/EventArgs/Player/FlippingCoinEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/FlippingCoinEventArgs.cs @@ -8,13 +8,14 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using API.Features.Items; using Interfaces; + using InventorySystem.Items.Coin; /// /// Contains all information before a player flips a coin. /// - public class FlippingCoinEventArgs : IPlayerEvent, IDeniableEvent + public class FlippingCoinEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -22,12 +23,16 @@ public class FlippingCoinEventArgs : IPlayerEvent, IDeniableEvent /// /// /// + /// + /// + /// /// /// /// - public FlippingCoinEventArgs(Player player, bool isTails) + public FlippingCoinEventArgs(Player player, Coin coin, bool isTails) { Player = player; + Item = Item.Get(coin); IsTails = isTails; } @@ -36,6 +41,9 @@ public FlippingCoinEventArgs(Player player, bool isTails) /// public Player Player { get; } + /// + public Item Item { get; } + /// /// Gets or sets a value indicating whether or not the coin is landing on tails. /// diff --git a/Exiled.Events/EventArgs/Player/InteractingDoorEventArgs.cs b/Exiled.Events/EventArgs/Player/InteractingDoorEventArgs.cs index fc3f590cae..f5991e6111 100644 --- a/Exiled.Events/EventArgs/Player/InteractingDoorEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/InteractingDoorEventArgs.cs @@ -8,9 +8,8 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using Exiled.API.Features.Doors; using Interactables.Interobjects.DoorUtils; - using Interfaces; /// @@ -43,7 +42,7 @@ public InteractingDoorEventArgs(Player player, DoorVariant door, bool isAllowed public bool IsAllowed { get; set; } /// - /// Gets or sets the instance. + /// Gets or sets the instance. /// public Door Door { get; set; } @@ -52,4 +51,4 @@ public InteractingDoorEventArgs(Player player, DoorVariant door, bool isAllowed /// public Player Player { get; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Player/MakingNoiseEventArgs.cs b/Exiled.Events/EventArgs/Player/MakingNoiseEventArgs.cs index 3afbaa1ff3..e3f6a50b5c 100644 --- a/Exiled.Events/EventArgs/Player/MakingNoiseEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/MakingNoiseEventArgs.cs @@ -11,26 +11,22 @@ namespace Exiled.Events.EventArgs.Player using Interfaces; - using PlayerRoles.FirstPersonControl.Thirdperson; - /// /// Contains all information before a player makes noise. /// - public class MakingNoiseEventArgs : IPlayerEvent + public class MakingNoiseEventArgs : IPlayerEvent, IDeniableEvent { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// - /// The instance. - /// - /// - /// - /// - public MakingNoiseEventArgs(AnimatedCharacterModel animatedCharacterModel, float distance) + /// + /// + /// + public MakingNoiseEventArgs(Player player, float distance, bool isAllowed = true) { - Player = Player.Get(animatedCharacterModel.OwnerHub); + Player = player; Distance = distance; + IsAllowed = isAllowed; } /// @@ -39,8 +35,11 @@ public MakingNoiseEventArgs(AnimatedCharacterModel animatedCharacterModel, float public Player Player { get; } /// - /// Gets the footsteps distance. + /// Gets or sets the footsteps distance. /// - public float Distance { get; } + public float Distance { get; set; } + + /// + public bool IsAllowed { get; set; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ProcessingHotkeyEventArgs.cs b/Exiled.Events/EventArgs/Player/ProcessingHotkeyEventArgs.cs deleted file mode 100644 index 3841f14378..0000000000 --- a/Exiled.Events/EventArgs/Player/ProcessingHotkeyEventArgs.cs +++ /dev/null @@ -1,54 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.EventArgs.Player -{ - using API.Enums; - using API.Features; - - using Interfaces; - - /// - /// Contains all information before pressing a hotkey. - /// - public class ProcessingHotkeyEventArgs : IPlayerEvent, IDeniableEvent - { - /// - /// Initializes a new instance of the class. - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public ProcessingHotkeyEventArgs(Player player, HotkeyButton hotkey, bool isAllowed = true) - { - Player = player; - Hotkey = hotkey; - IsAllowed = isAllowed; - } - - /// - /// Gets the pressed hotkey. - /// - public HotkeyButton Hotkey { get; } - - /// - /// Gets or sets a value indicating whether or not the hotkey is allowed to be pressed. - /// - public bool IsAllowed { get; set; } - - /// - /// Gets the player who's pressing the hotkey. - /// - public Player Player { get; } - } -} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs b/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs index 3d36517931..b3caa7bb8d 100644 --- a/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs @@ -23,12 +23,15 @@ public class ReloadingWeaponEventArgs : IPlayerEvent, IFirearmEvent, IDeniableEv /// /// /// + /// + /// + /// /// /// /// - public ReloadingWeaponEventArgs(Player player, bool isAllowed = true) + public ReloadingWeaponEventArgs(Player player, Firearm firearm, bool isAllowed = true) { - Firearm = player.CurrentItem as Firearm; + Firearm = firearm; Player = player; IsAllowed = isAllowed; } @@ -43,6 +46,9 @@ public ReloadingWeaponEventArgs(Player player, bool isAllowed = true) /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the player who's reloading the weapon. /// diff --git a/Exiled.Events/EventArgs/Player/RemovingHandcuffsEventArgs.cs b/Exiled.Events/EventArgs/Player/RemovingHandcuffsEventArgs.cs index efe3c53d79..8fe8c6861d 100644 --- a/Exiled.Events/EventArgs/Player/RemovingHandcuffsEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/RemovingHandcuffsEventArgs.cs @@ -8,11 +8,12 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; + using Exiled.Events.EventArgs.Interfaces; /// /// Contains all information before freeing a handcuffed player. /// - public class RemovingHandcuffsEventArgs : HandcuffingEventArgs + public class RemovingHandcuffsEventArgs : IPlayerEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -21,8 +22,25 @@ public class RemovingHandcuffsEventArgs : HandcuffingEventArgs /// The target player to be uncuffed. /// Indicates whether the event can be executed or not. public RemovingHandcuffsEventArgs(Player cuffer, Player target, bool isAllowed = true) - : base(cuffer, target, isAllowed) { + Player = cuffer; + Target = target; + IsAllowed = isAllowed; } + + /// + /// Gets the target player to be cuffed. + /// + public Player Target { get; } + + /// + /// Gets or sets a value indicating whether or not the player can be handcuffed. + /// + public bool IsAllowed { get; set; } + + /// + /// Gets the cuffer player. + /// + public Player Player { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ShootingEventArgs.cs b/Exiled.Events/EventArgs/Player/ShootingEventArgs.cs index d2df688d84..287687ec92 100644 --- a/Exiled.Events/EventArgs/Player/ShootingEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ShootingEventArgs.cs @@ -9,6 +9,8 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; + using Exiled.API.Features.Items; + using Interfaces; using InventorySystem.Items.Firearms.BasicMessages; @@ -20,7 +22,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before a player fires a weapon. /// - public class ShootingEventArgs : IPlayerEvent, IDeniableEvent + public class ShootingEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -28,12 +30,16 @@ public class ShootingEventArgs : IPlayerEvent, IDeniableEvent /// /// /// + /// + /// + /// /// /// /// - public ShootingEventArgs(Player shooter, ShotMessage msg) + public ShootingEventArgs(Player shooter, Firearm firearm, ShotMessage msg) { Player = shooter; + Firearm = firearm; ShotMessage = msg; } @@ -42,6 +48,14 @@ public ShootingEventArgs(Player shooter, ShotMessage msg) /// public Player Player { get; } + /// + /// Gets the target . + /// + public Firearm Firearm { get; } + + /// + public Item Item => Firearm; + /// /// Gets or sets the for the event. /// diff --git a/Exiled.Events/EventArgs/Player/StayingOnEnvironmentalHazardEventArgs.cs b/Exiled.Events/EventArgs/Player/StayingOnEnvironmentalHazardEventArgs.cs index 984923ccd6..1694461db4 100644 --- a/Exiled.Events/EventArgs/Player/StayingOnEnvironmentalHazardEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/StayingOnEnvironmentalHazardEventArgs.cs @@ -7,8 +7,8 @@ namespace Exiled.Events.EventArgs.Player { + using Exiled.API.Features.Hazards; using Hazards; - using Interfaces; /// @@ -24,7 +24,7 @@ public class StayingOnEnvironmentalHazardEventArgs : IPlayerEvent, IHazardEvent public StayingOnEnvironmentalHazardEventArgs(API.Features.Player player, EnvironmentalHazard environmentalHazard) { Player = player; - EnvironmentalHazard = environmentalHazard; + Hazard = Hazard.Get(environmentalHazard); } /// @@ -32,9 +32,7 @@ public StayingOnEnvironmentalHazardEventArgs(API.Features.Player player, Environ /// public API.Features.Player Player { get; } - /// - /// Gets the environmental hazard that the player is staying on. - /// - public EnvironmentalHazard EnvironmentalHazard { get; } + /// + public Hazard Hazard { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/StoppingGeneratorEventArgs.cs b/Exiled.Events/EventArgs/Player/StoppingGeneratorEventArgs.cs index d2ffe73fa7..6862e90aaf 100644 --- a/Exiled.Events/EventArgs/Player/StoppingGeneratorEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/StoppingGeneratorEventArgs.cs @@ -8,23 +8,40 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using Exiled.Events.EventArgs.Interfaces; using MapGeneration.Distributors; /// - /// Contains all information before a player ejects a tablet from a generator. + /// Contains all information before a player flips the switch of the generator. /// - public class StoppingGeneratorEventArgs : ActivatingGeneratorEventArgs + public class StoppingGeneratorEventArgs : IPlayerEvent, IGeneratorEvent, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// The player who's ejecting the tablet. + /// The player who's flipping the switch. /// The instance. - /// Indicates whether or not the tablet can be ejected. + /// Indicates whether or not the switch of the generator can be flipped. public StoppingGeneratorEventArgs(Player player, Scp079Generator generator, bool isAllowed = true) - : base(player, generator, isAllowed) { + Player = player; + Generator = Generator.Get(generator); + IsAllowed = isAllowed; } + + /// + /// Gets or sets a value indicating whether or not the switch can be flipped. + /// + public bool IsAllowed { get; set; } + + /// + /// Gets the instance. + /// + public Generator Generator { get; } + + /// + /// Gets the player who's filpping the switch of the generator. + /// + public Player Player { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/ThrowingRequestEventArgs.cs b/Exiled.Events/EventArgs/Player/ThrowingRequestEventArgs.cs index ed817da098..66078cfe6a 100644 --- a/Exiled.Events/EventArgs/Player/ThrowingRequestEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ThrowingRequestEventArgs.cs @@ -17,7 +17,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before receving a throwing request. /// - public class ThrowingRequestEventArgs : IPlayerEvent, IDeniableEvent + public class ThrowingRequestEventArgs : IPlayerEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -25,13 +25,11 @@ public class ThrowingRequestEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - /// - public ThrowingRequestEventArgs(Player player, ThrowableItem item, ThrowableNetworkHandler.RequestType request, bool isAllowed = true) + public ThrowingRequestEventArgs(Player player, ThrowableItem item, ThrowableNetworkHandler.RequestType request) { Player = player; Throwable = (Throwable)Item.Get(item); RequestType = (ThrowRequest)request; - IsAllowed = isAllowed; } /// @@ -44,14 +42,12 @@ public ThrowingRequestEventArgs(Player player, ThrowableItem item, ThrowableNetw /// public Throwable Throwable { get; set; } + /// + public Item Item => Throwable; + /// /// Gets or sets the type of throw being requested. /// public ThrowRequest RequestType { get; set; } - - /// - /// Gets or sets a value indicating whether or not the grenade can be thrown. - /// - public bool IsAllowed { get; set; } = true; } } diff --git a/Exiled.Events/EventArgs/Player/ThrownProjectileEventArgs.cs b/Exiled.Events/EventArgs/Player/ThrownProjectileEventArgs.cs index 2dd919371a..aaf654d426 100644 --- a/Exiled.Events/EventArgs/Player/ThrownProjectileEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/ThrownProjectileEventArgs.cs @@ -18,7 +18,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information after a player throws a grenade. /// - public class ThrownProjectileEventArgs : IPlayerEvent + public class ThrownProjectileEventArgs : IPlayerEvent, IItemEvent, IPickupEvent { /// /// Initializes a new instance of the class. @@ -26,7 +26,7 @@ public class ThrownProjectileEventArgs : IPlayerEvent /// /// /// - public ThrownProjectileEventArgs(Player player, ThrowableItem item, ThrownProjectile projectile) + public ThrownProjectileEventArgs(ThrownProjectile projectile, Player player, ThrowableItem item) { Player = player; Throwable = (Throwable)Item.Get(item); @@ -43,9 +43,15 @@ public ThrownProjectileEventArgs(Player player, ThrowableItem item, ThrownProjec /// public Throwable Throwable { get; } + /// + public Item Item => Throwable; + /// /// Gets the thrown grenade. /// public Projectile Projectile { get; } + + /// + public Pickup Pickup => Projectile; } } diff --git a/Exiled.Events/EventArgs/Player/TogglingFlashlightEventArgs.cs b/Exiled.Events/EventArgs/Player/TogglingFlashlightEventArgs.cs index 2e5da011d5..892b9ec1c5 100644 --- a/Exiled.Events/EventArgs/Player/TogglingFlashlightEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/TogglingFlashlightEventArgs.cs @@ -17,7 +17,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before a player toggles the flashlight. /// - public class TogglingFlashlightEventArgs : IPlayerEvent, IDeniableEvent + public class TogglingFlashlightEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { private readonly bool initialState; @@ -46,6 +46,9 @@ public TogglingFlashlightEventArgs(ReferenceHub hub, FlashlightItem flashlight, /// public Flashlight Flashlight { get; } + /// + public Item Item => Flashlight; + /// /// Gets or sets a value indicating whether or not the flashlight should be on. /// diff --git a/Exiled.Events/EventArgs/Player/TogglingWeaponFlashlightEventArgs.cs b/Exiled.Events/EventArgs/Player/TogglingWeaponFlashlightEventArgs.cs index 61e6ac1bc0..e697ed79e4 100644 --- a/Exiled.Events/EventArgs/Player/TogglingWeaponFlashlightEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/TogglingWeaponFlashlightEventArgs.cs @@ -23,26 +23,27 @@ public class TogglingWeaponFlashlightEventArgs : IPlayerEvent, IFirearmEvent, ID /// /// /// + /// + /// + /// /// /// /// /// /// /// - public TogglingWeaponFlashlightEventArgs(Player player, bool newState, bool isAllowed = true) + public TogglingWeaponFlashlightEventArgs(Player player, Firearm firearm, bool newState, bool isAllowed = true) { - Firearm = player.CurrentItem as Firearm; + Firearm = firearm; Player = player; NewState = newState; IsAllowed = isAllowed; } -#pragma warning disable SA1623 // Property summary documentation should match accessors /// - /// Gets or sets the new weapon's flashlight state. + /// Gets or sets a value indicating whether the new weapon's flashlight state will be enabled. /// public bool NewState { get; set; } -#pragma warning restore SA1623 // Property summary documentation should match accessors /// /// Gets or sets a value indicating whether or not the weapon's flashlight can be toggled. @@ -54,6 +55,9 @@ public TogglingWeaponFlashlightEventArgs(Player player, bool newState, bool isAl /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the player who's toggling the weapon's flashlight. /// diff --git a/Exiled.Events/EventArgs/Player/TransmittingEventArgs.cs b/Exiled.Events/EventArgs/Player/TransmittingEventArgs.cs index b77fc94442..f1f421539c 100644 --- a/Exiled.Events/EventArgs/Player/TransmittingEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/TransmittingEventArgs.cs @@ -15,7 +15,7 @@ namespace Exiled.Events.EventArgs.Player using VoiceChat; /// - /// Contains all information after a player presses the transmission key. + /// Contains all information regarding the player using the radio. /// public class TransmittingEventArgs : IPlayerEvent, IDeniableEvent { diff --git a/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs b/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs index 9bf3950070..213f15adba 100644 --- a/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs @@ -23,12 +23,15 @@ public class UnloadingWeaponEventArgs : IPlayerEvent, IFirearmEvent, IDeniableEv /// /// /// + /// + /// + /// /// /// /// - public UnloadingWeaponEventArgs(Player player, bool isAllowed = true) + public UnloadingWeaponEventArgs(Player player, Firearm firearm, bool isAllowed = true) { - Firearm = player.CurrentItem as Firearm; + Firearm = firearm; Player = player; IsAllowed = isAllowed; } @@ -43,6 +46,9 @@ public UnloadingWeaponEventArgs(Player player, bool isAllowed = true) /// public Firearm Firearm { get; } + /// + public Item Item => Firearm; + /// /// Gets the player who's unloading the weapon. /// diff --git a/Exiled.Events/EventArgs/Player/UsedItemEventArgs.cs b/Exiled.Events/EventArgs/Player/UsedItemEventArgs.cs index 571cf6fdad..bda1d7c86e 100644 --- a/Exiled.Events/EventArgs/Player/UsedItemEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/UsedItemEventArgs.cs @@ -19,7 +19,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information after a player used an item. /// - public class UsedItemEventArgs : IPlayerEvent + public class UsedItemEventArgs : IPlayerEvent, IUsableEvent { /// /// Initializes a new instance of the class. @@ -30,23 +30,19 @@ public class UsedItemEventArgs : IPlayerEvent /// /// /// - public UsedItemEventArgs(Player player, UsableItem item) + public UsedItemEventArgs(ReferenceHub player, UsableItem item) { - try - { - Player = player; - Item = item is null ? null : (Usable)API.Features.Items.Item.Get(item); - } - catch (Exception e) - { - Log.Error($"{nameof(UsedItemEventArgs)}.ctor: {e}"); - } + Player = Player.Get(player); + Usable = API.Features.Items.Item.Get(item) is Usable usable ? usable : null; } /// /// Gets the item that the player used. /// - public Usable Item { get; } + public Usable Usable { get; } + + /// + public Item Item => Usable; /// /// Gets the player who used the item. diff --git a/Exiled.Events/EventArgs/Player/UsingItemCompletedEventArgs.cs b/Exiled.Events/EventArgs/Player/UsingItemCompletedEventArgs.cs new file mode 100644 index 0000000000..00198760e8 --- /dev/null +++ b/Exiled.Events/EventArgs/Player/UsingItemCompletedEventArgs.cs @@ -0,0 +1,52 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Player +{ + using API.Features; + using Exiled.API.Features.Items; + using Interfaces; + + using InventorySystem.Items.Usables; + + /// + /// Contains all information before a player uses an item. + /// + public class UsingItemCompletedEventArgs : IPlayerEvent, IDeniableEvent, IUsableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The player who's going to use the item. + /// + /// + /// + public UsingItemCompletedEventArgs(Player player, UsableItem item) + { + Player = player; + Usable = Item.Get(item) is Usable usable ? usable : null; + } + + /// + /// Gets the item that the player using. + /// + public Usable Usable { get; } + + /// + public Item Item => Usable; + + /// + /// Gets the player who using the item. + /// + public Player Player { get; } + + /// + /// Gets or sets a value indicating whether or not the player can use the item. + /// + public bool IsAllowed { get; set; } = true; + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Player/UsingItemEventArgs.cs b/Exiled.Events/EventArgs/Player/UsingItemEventArgs.cs index e6030bc228..999eecf568 100644 --- a/Exiled.Events/EventArgs/Player/UsingItemEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/UsingItemEventArgs.cs @@ -8,7 +8,7 @@ namespace Exiled.Events.EventArgs.Player { using API.Features; - + using Exiled.API.Features.Items; using Interfaces; using InventorySystem.Items.Usables; @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before a player uses an item. /// - public class UsingItemEventArgs : UsedItemEventArgs, IDeniableEvent + public class UsingItemEventArgs : IPlayerEvent, IDeniableEvent, IUsableEvent { /// /// Initializes a new instance of the class. @@ -29,11 +29,25 @@ public class UsingItemEventArgs : UsedItemEventArgs, IDeniableEvent /// /// public UsingItemEventArgs(Player player, UsableItem item, float cooldown) - : base(player, item) { + Player = player; + Usable = Item.Get(item) is Usable usable ? usable : null; Cooldown = cooldown; } + /// + /// Gets the item that the player using. + /// + public Usable Usable { get; } + + /// + public Item Item => Usable; + + /// + /// Gets the player who using the item. + /// + public Player Player { get; } + /// /// Gets or sets the item cooldown. /// diff --git a/Exiled.Events/EventArgs/Player/UsingMicroHIDEnergyEventArgs.cs b/Exiled.Events/EventArgs/Player/UsingMicroHIDEnergyEventArgs.cs index 8c98109894..353617e2da 100644 --- a/Exiled.Events/EventArgs/Player/UsingMicroHIDEnergyEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/UsingMicroHIDEnergyEventArgs.cs @@ -17,7 +17,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before MicroHID energy is changed. /// - public class UsingMicroHIDEnergyEventArgs : IPlayerEvent, IDeniableEvent + public class UsingMicroHIDEnergyEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -51,6 +51,9 @@ public UsingMicroHIDEnergyEventArgs(Player player, MicroHIDItem microHIDitem, Hi /// public MicroHid MicroHID { get; } + /// + public Item Item => MicroHID; + /// /// Gets the current state of the MicroHID. /// diff --git a/Exiled.Events/EventArgs/Player/UsingRadioBatteryEventArgs.cs b/Exiled.Events/EventArgs/Player/UsingRadioBatteryEventArgs.cs index da88b9a97c..7b0191a150 100644 --- a/Exiled.Events/EventArgs/Player/UsingRadioBatteryEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/UsingRadioBatteryEventArgs.cs @@ -17,7 +17,7 @@ namespace Exiled.Events.EventArgs.Player /// /// Contains all information before radio battery charge is changed. /// - public class UsingRadioBatteryEventArgs : IPlayerEvent, IDeniableEvent + public class UsingRadioBatteryEventArgs : IPlayerEvent, IDeniableEvent, IItemEvent { /// /// Initializes a new instance of the class. @@ -47,6 +47,9 @@ public UsingRadioBatteryEventArgs(RadioItem radio, Player player, float drain, b /// public Radio Radio { get; } + /// + public Item Item => Radio; + /// /// Gets or sets the radio battery drain per second. /// diff --git a/Exiled.Events/EventArgs/Player/VoiceChattingEventArgs.cs b/Exiled.Events/EventArgs/Player/VoiceChattingEventArgs.cs index 50df2774b7..d838f0a066 100644 --- a/Exiled.Events/EventArgs/Player/VoiceChattingEventArgs.cs +++ b/Exiled.Events/EventArgs/Player/VoiceChattingEventArgs.cs @@ -12,6 +12,8 @@ namespace Exiled.Events.EventArgs.Player using PlayerRoles.Voice; + using VoiceChat.Networking; + /// /// Contains all information after a player presses the voicechat key. /// @@ -23,15 +25,19 @@ public class VoiceChattingEventArgs : IPlayerEvent, IDeniableEvent /// /// /// + /// + /// + /// /// /// /// /// /// /// - public VoiceChattingEventArgs(Player player, VoiceModuleBase voiceModule, bool isAllowed = true) + public VoiceChattingEventArgs(Player player, VoiceMessage voiceMessage, VoiceModuleBase voiceModule, bool isAllowed = true) { Player = player; + VoiceMessage = voiceMessage; VoiceModule = voiceModule; IsAllowed = isAllowed; } @@ -41,6 +47,11 @@ public VoiceChattingEventArgs(Player player, VoiceModuleBase voiceModule, bool i /// public Player Player { get; } + /// + /// Gets or sets the 's . + /// + public VoiceMessage VoiceMessage { get; set; } + /// /// Gets the 's . /// @@ -51,4 +62,4 @@ public VoiceChattingEventArgs(Player player, VoiceModuleBase voiceModule, bool i /// public bool IsAllowed { get; set; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Scp049/ActivatingSenseEventArgs.cs b/Exiled.Events/EventArgs/Scp049/ActivatingSenseEventArgs.cs index 91a695915f..80f8695e63 100644 --- a/Exiled.Events/EventArgs/Scp049/ActivatingSenseEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp049/ActivatingSenseEventArgs.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -8,15 +8,16 @@ namespace Exiled.Events.EventArgs.Scp049 { using API.Features; - using Interfaces; using PlayerRoles.PlayableScps.Scp049; + using Scp049Role = API.Features.Roles.Scp049Role; + /// /// Contains all information before SCP-049 sense is activated. /// - public class ActivatingSenseEventArgs : IPlayerEvent, IDeniableEvent + public class ActivatingSenseEventArgs : IScp049Event, IDeniableEvent { /// /// Initializes a new instance of the class with information before SCP-049 sense is activated. @@ -27,6 +28,7 @@ public class ActivatingSenseEventArgs : IPlayerEvent, IDeniableEvent public ActivatingSenseEventArgs(Player player, Player target, bool isAllowed = true) { Player = player; + Scp049 = player.Role.As(); Target = target; IsAllowed = isAllowed; Cooldown = Scp049SenseAbility.AttemptFailCooldown; @@ -38,6 +40,9 @@ public ActivatingSenseEventArgs(Player player, Player target, bool isAllowed = t /// public Player Player { get; } + /// + public Scp049Role Scp049 { get; } + /// /// Gets the Player who the sense ability is affecting. /// diff --git a/Exiled.Events/EventArgs/Scp049/AttackingEventArgs.cs b/Exiled.Events/EventArgs/Scp049/AttackingEventArgs.cs new file mode 100644 index 0000000000..75fec8fd04 --- /dev/null +++ b/Exiled.Events/EventArgs/Scp049/AttackingEventArgs.cs @@ -0,0 +1,51 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Scp049 +{ + using Exiled.API.Features; + using Exiled.API.Features.Roles; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// Contains all information before SCP-049 attacks player. + /// + public class AttackingEventArgs : IScp049Event, IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + public AttackingEventArgs(Player player, Player target, bool isAllowed = true) + { + Player = player; + Scp049 = player.Role.As(); + Target = target; + IsAllowed = isAllowed; + } + + /// + /// Gets the player controlling SCP-049. + /// + public Player Player { get; } + + /// + public Scp049Role Scp049 { get; } + + /// + /// Gets the target of attack. + /// + public Player Target { get; } + + /// + /// Gets or sets a value indicating whether or not target can be attacked. + /// + public bool IsAllowed { get; set; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp049/FinishingRecallEventArgs.cs b/Exiled.Events/EventArgs/Scp049/FinishingRecallEventArgs.cs index d175d63d4f..edb604dcd9 100644 --- a/Exiled.Events/EventArgs/Scp049/FinishingRecallEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp049/FinishingRecallEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp049 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-049 finishes recalling a player. /// - public class FinishingRecallEventArgs : IPlayerEvent, IDeniableEvent + public class FinishingRecallEventArgs : IScp049Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -35,6 +35,7 @@ public FinishingRecallEventArgs(Player target, Player scp049, BasicRagdoll ragdo { Target = target; Player = scp049; + Scp049 = Player.Role.As(); Ragdoll = Ragdoll.Get(ragdoll); IsAllowed = isAllowed; } @@ -44,6 +45,9 @@ public FinishingRecallEventArgs(Player target, Player scp049, BasicRagdoll ragdo /// public Player Player { get; } + /// + public Scp049Role Scp049 { get; } + /// /// Gets the player who's getting recalled. /// diff --git a/Exiled.Events/EventArgs/Scp049/SendingCallEventArgs.cs b/Exiled.Events/EventArgs/Scp049/SendingCallEventArgs.cs index 49699f6d5b..087dfa10f1 100644 --- a/Exiled.Events/EventArgs/Scp049/SendingCallEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp049/SendingCallEventArgs.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp049 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-049 Call is activated. /// - public class SendingCallEventArgs : IPlayerEvent, IDeniableEvent + public class SendingCallEventArgs : IScp049Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -25,6 +25,7 @@ public class SendingCallEventArgs : IPlayerEvent, IDeniableEvent public SendingCallEventArgs(Player player, float duration, bool isAllowed = true) { Player = player; + Scp049 = Player.Role.As(); Duration = duration; IsAllowed = isAllowed; } @@ -34,6 +35,9 @@ public SendingCallEventArgs(Player player, float duration, bool isAllowed = true /// public Player Player { get; } + /// + public Scp049Role Scp049 { get; } + /// /// Gets or sets the duration of the Call Ability. /// diff --git a/Exiled.Events/EventArgs/Scp049/StartingRecallEventArgs.cs b/Exiled.Events/EventArgs/Scp049/StartingRecallEventArgs.cs index a0c03f5027..c43abb1aab 100644 --- a/Exiled.Events/EventArgs/Scp049/StartingRecallEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp049/StartingRecallEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp049 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-049 begins recalling a player. /// - public class StartingRecallEventArgs : IPlayerEvent, IRagdollEvent, IDeniableEvent + public class StartingRecallEventArgs : IScp049Event, IRagdollEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -35,6 +35,7 @@ public StartingRecallEventArgs(Player target, Player scp049, Ragdoll ragdoll, bo { Target = target; Player = scp049; + Scp049 = scp049.Role.As(); Ragdoll = ragdoll; IsAllowed = isAllowed; } @@ -54,6 +55,9 @@ public StartingRecallEventArgs(Player target, Player scp049, Ragdoll ragdoll, bo /// public Player Player { get; } + /// + public Scp049Role Scp049 { get; } + /// /// Gets the Ragdoll who's getting recalled. /// diff --git a/Exiled.Events/EventArgs/Scp049/ConsumingCorpseEventArgs.cs b/Exiled.Events/EventArgs/Scp0492/ConsumingCorpseEventArgs.cs similarity index 74% rename from Exiled.Events/EventArgs/Scp049/ConsumingCorpseEventArgs.cs rename to Exiled.Events/EventArgs/Scp0492/ConsumingCorpseEventArgs.cs index 3d0ffe3a3e..080694a292 100644 --- a/Exiled.Events/EventArgs/Scp049/ConsumingCorpseEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp0492/ConsumingCorpseEventArgs.cs @@ -1,14 +1,14 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // // ----------------------------------------------------------------------- -namespace Exiled.Events.EventArgs.Scp049 +namespace Exiled.Events.EventArgs.Scp0492 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; using PlayerRoles.PlayableScps.Scp049.Zombies; @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp049 /// /// Contains all information before zombie consumes RagDolls. /// - public class ConsumingCorpseEventArgs : IPlayerEvent, IRagdollEvent, IDeniableEvent + public class ConsumingCorpseEventArgs : IScp0492Event, IRagdollEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -26,10 +26,11 @@ public class ConsumingCorpseEventArgs : IPlayerEvent, IRagdollEvent, IDeniableEv /// /// /// See for all RagDolls consumed. - public ConsumingCorpseEventArgs(Player player, Ragdoll ragDoll, ZombieConsumeAbility.ConsumeError error, bool isAllowed = true) + public ConsumingCorpseEventArgs(ReferenceHub player, BasicRagdoll ragDoll, ZombieConsumeAbility.ConsumeError error, bool isAllowed = true) { - Player = player; - Ragdoll = ragDoll; + Player = Player.Get(player); + Scp0492 = Player.Role.As(); + Ragdoll = Ragdoll.Get(ragDoll); ErrorCode = error; IsAllowed = isAllowed; } @@ -39,6 +40,9 @@ public ConsumingCorpseEventArgs(Player player, Ragdoll ragDoll, ZombieConsumeAbi /// public Player Player { get; } + /// + public Scp0492Role Scp0492 { get; } + /// /// Gets the RagDoll to be consumed. /// diff --git a/Exiled.Events/EventArgs/Scp0492/TriggeringBloodlustEventArgs.cs b/Exiled.Events/EventArgs/Scp0492/TriggeringBloodlustEventArgs.cs new file mode 100644 index 0000000000..8ce235fbd6 --- /dev/null +++ b/Exiled.Events/EventArgs/Scp0492/TriggeringBloodlustEventArgs.cs @@ -0,0 +1,45 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Scp0492 +{ + using Exiled.API.Features; + using Exiled.API.Features.Roles; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// Contains all information before a enters Bloodlust. + /// + public class TriggeringBloodlustEventArgs : IScp0492Event, IPlayerEvent, IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The triggering the event. + /// The who is SCP-049-2. + public TriggeringBloodlustEventArgs(Player player, Player scp0492) + { + Target = player; + Player = scp0492; + Scp0492 = Player.Role.As(); + } + + /// + /// Gets the who is target by SCP-049-2. + /// + public Player Target { get; } + + /// + public Player Player { get; } + + /// + public Scp0492Role Scp0492 { get; } + + /// + public bool IsAllowed { get; set; } = true; + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp079/ChangingCameraEventArgs.cs b/Exiled.Events/EventArgs/Scp079/ChangingCameraEventArgs.cs index 943b944ca2..7192dd2b1d 100644 --- a/Exiled.Events/EventArgs/Scp079/ChangingCameraEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/ChangingCameraEventArgs.cs @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before a SCP-079 changes the current camera. /// - public class ChangingCameraEventArgs : IPlayerEvent, ICameraEvent, IDeniableEvent + public class ChangingCameraEventArgs : IScp079Event, ICameraEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -33,9 +33,10 @@ public class ChangingCameraEventArgs : IPlayerEvent, ICameraEvent, IDeniableEven public ChangingCameraEventArgs(Player player, Scp079Camera camera, float auxiliaryPowerCost) { Player = player; + Scp079 = Player.Role.As(); Camera = Camera.Get(camera); AuxiliaryPowerCost = auxiliaryPowerCost; - IsAllowed = auxiliaryPowerCost <= player.Role.As().Energy; + IsAllowed = auxiliaryPowerCost <= Scp079.Energy; } /// @@ -43,6 +44,9 @@ public ChangingCameraEventArgs(Player player, Scp079Camera camera, float auxilia /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets or sets the amount of auxiliary power that will be required to switch cameras. /// diff --git a/Exiled.Events/EventArgs/Scp079/ChangingSpeakerStatusEventArgs.cs b/Exiled.Events/EventArgs/Scp079/ChangingSpeakerStatusEventArgs.cs index e790de1fb1..0af7583c29 100644 --- a/Exiled.Events/EventArgs/Scp079/ChangingSpeakerStatusEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/ChangingSpeakerStatusEventArgs.cs @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 uses a speaker. /// - public class ChangingSpeakerStatusEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent + public class ChangingSpeakerStatusEventArgs : IScp079Event, IRoomEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -30,7 +30,8 @@ public class ChangingSpeakerStatusEventArgs : IPlayerEvent, IRoomEvent, IDeniabl public ChangingSpeakerStatusEventArgs(Player player, bool isAllowed) { Player = player; - Room = Room.Get(player.Role.As().Speaker.Room); + Scp079 = Player.Role.As(); + Room = Room.Get(Scp079.Speaker.Room); IsAllowed = isAllowed; } @@ -39,6 +40,9 @@ public ChangingSpeakerStatusEventArgs(Player player, bool isAllowed) /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the room that the speaker is located in. /// diff --git a/Exiled.Events/EventArgs/Scp079/ElevatorTeleportingEventArgs.cs b/Exiled.Events/EventArgs/Scp079/ElevatorTeleportingEventArgs.cs index 5326e0163a..f9f6316da0 100644 --- a/Exiled.Events/EventArgs/Scp079/ElevatorTeleportingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/ElevatorTeleportingEventArgs.cs @@ -18,7 +18,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 changes rooms via elevator. /// - public class ElevatorTeleportingEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent + public class ElevatorTeleportingEventArgs : IScp079Event, IRoomEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -38,10 +38,11 @@ public class ElevatorTeleportingEventArgs : IPlayerEvent, IRoomEvent, IDeniableE public ElevatorTeleportingEventArgs(Player player, RoomIdentifier room, ElevatorDoor elevatorDoor, float auxiliaryPowerCost) { Player = player; + Scp079 = Player.Role.As(); Room = Room.Get(room); Lift = Lift.Get(elevatorDoor.TargetPanel.AssignedChamber); AuxiliaryPowerCost = auxiliaryPowerCost; - IsAllowed = auxiliaryPowerCost <= player.Role.As().Energy; + IsAllowed = auxiliaryPowerCost <= Scp079.Energy; } /// @@ -49,6 +50,9 @@ public ElevatorTeleportingEventArgs(Player player, RoomIdentifier room, Elevator /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets or sets the amount of auxiliary power required to teleport to an elevator camera. /// diff --git a/Exiled.Events/EventArgs/Scp079/GainingExperienceEventArgs.cs b/Exiled.Events/EventArgs/Scp079/GainingExperienceEventArgs.cs index d57bde78c8..b734d9d70d 100644 --- a/Exiled.Events/EventArgs/Scp079/GainingExperienceEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/GainingExperienceEventArgs.cs @@ -9,13 +9,15 @@ namespace Exiled.Events.EventArgs.Scp079 { using Exiled.API.Features; using Exiled.Events.EventArgs.Interfaces; - + using PlayerRoles; using PlayerRoles.PlayableScps.Scp079; + using Scp079Role = API.Features.Roles.Scp079Role; + /// /// Contains all information before SCP-079 gains experience. /// - public class GainingExperienceEventArgs : IPlayerEvent, IDeniableEvent + public class GainingExperienceEventArgs : IScp079Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -26,24 +28,35 @@ public class GainingExperienceEventArgs : IPlayerEvent, IDeniableEvent /// /// /// + /// + /// + /// /// /// /// /// /// /// - public GainingExperienceEventArgs(Player player, Scp079HudTranslation gainType, int amount, bool isAllowed = true) + public GainingExperienceEventArgs(Player player, Scp079HudTranslation gainType, int amount, RoleTypeId roleType, bool isAllowed = true) { Player = player; + Scp079 = Player.Role.As(); GainType = gainType; + RoleType = roleType; Amount = amount; IsAllowed = isAllowed; } /// - /// Gets the experience gain type. + /// Gets or sets the role that was used to gain experience. + /// The RoleType will be when it's not an assisted experience. /// - public Scp079HudTranslation GainType { get; } + public RoleTypeId RoleType { get; set; } + + /// + /// Gets or sets the experience gain type. + /// + public Scp079HudTranslation GainType { get; set; } /// /// Gets or sets the amount of experience to be gained. @@ -59,5 +72,8 @@ public GainingExperienceEventArgs(Player player, Scp079HudTranslation gainType, /// Gets the player who's controlling SCP-079. /// public Player Player { get; } + + /// + public Scp079Role Scp079 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp079/GainingLevelEventArgs.cs b/Exiled.Events/EventArgs/Scp079/GainingLevelEventArgs.cs index d4a7b5ea7f..78c098f002 100644 --- a/Exiled.Events/EventArgs/Scp079/GainingLevelEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/GainingLevelEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp079 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-079 gains a level. /// - public class GainingLevelEventArgs : IPlayerEvent, IDeniableEvent + public class GainingLevelEventArgs : IScp079Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -31,6 +31,7 @@ public class GainingLevelEventArgs : IPlayerEvent, IDeniableEvent public GainingLevelEventArgs(Player player, int newLevel, bool isAllowed = true) { Player = player; + Scp079 = Player.Role.As(); NewLevel = newLevel; IsAllowed = isAllowed; } @@ -49,5 +50,8 @@ public GainingLevelEventArgs(Player player, int newLevel, bool isAllowed = true) /// Gets the player who's controlling SCP-079. /// public Player Player { get; } + + /// + public Scp079Role Scp079 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp079/InteractingTeslaEventArgs.cs b/Exiled.Events/EventArgs/Scp079/InteractingTeslaEventArgs.cs index 3db01d3e00..96ca3b8510 100644 --- a/Exiled.Events/EventArgs/Scp079/InteractingTeslaEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/InteractingTeslaEventArgs.cs @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 triggers a tesla gate. /// - public class InteractingTeslaEventArgs : IPlayerEvent, ITeslaEvent, IDeniableEvent + public class InteractingTeslaEventArgs : IScp079Event, ITeslaEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -33,9 +33,10 @@ public class InteractingTeslaEventArgs : IPlayerEvent, ITeslaEvent, IDeniableEve public InteractingTeslaEventArgs(Player player, TeslaGate teslaGate, float auxiliaryPowerCost) { Player = player; + Scp079 = Player.Role.As(); Tesla = API.Features.TeslaGate.Get(teslaGate); AuxiliaryPowerCost = auxiliaryPowerCost; - IsAllowed = auxiliaryPowerCost <= player.Role.As().Energy; + IsAllowed = auxiliaryPowerCost <= Scp079.Energy; } /// @@ -43,6 +44,9 @@ public InteractingTeslaEventArgs(Player player, TeslaGate teslaGate, float auxil /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the that SCP-079 is triggering. /// diff --git a/Exiled.Events/EventArgs/Scp079/LockingDownEventArgs.cs b/Exiled.Events/EventArgs/Scp079/LockingDownEventArgs.cs index fb45fba9bd..4f9869ddf8 100644 --- a/Exiled.Events/EventArgs/Scp079/LockingDownEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/LockingDownEventArgs.cs @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 lockdowns a room. /// - public class LockingDownEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent + public class LockingDownEventArgs : IScp079Event, IRoomEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -33,9 +33,10 @@ public class LockingDownEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent public LockingDownEventArgs(Player player, RoomIdentifier roomIdentifier, float auxiliaryPowerCost) { Player = player; + Scp079 = Player.Role.As(); Room = Room.Get(roomIdentifier); AuxiliaryPowerCost = auxiliaryPowerCost; - IsAllowed = auxiliaryPowerCost <= player.Role.As().Energy; + IsAllowed = auxiliaryPowerCost <= Scp079.Energy; } /// @@ -43,6 +44,9 @@ public LockingDownEventArgs(Player player, RoomIdentifier roomIdentifier, float /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the of the room that will be locked down. /// diff --git a/Exiled.Events/EventArgs/Scp079/PingingEventArgs.cs b/Exiled.Events/EventArgs/Scp079/PingingEventArgs.cs index a0d57407db..4ea0b75cc9 100644 --- a/Exiled.Events/EventArgs/Scp079/PingingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/PingingEventArgs.cs @@ -10,7 +10,7 @@ namespace Exiled.Events.EventArgs.Scp079 using API.Features; using Exiled.API.Enums; - + using Exiled.API.Features.Roles; using Interfaces; using RelativePositioning; @@ -20,7 +20,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 pings a location. /// - public class PingingEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent + public class PingingEventArgs : IScp079Event, IRoomEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -46,6 +46,7 @@ public class PingingEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent public PingingEventArgs(ReferenceHub hub, RelativePosition position, int powerCost, byte proccesorindex, Vector3 syncNormal, bool isAllowed = true) { Player = Player.Get(hub); + Scp079 = Player.Role.As(); Position = position.Position; Room = Room.Get(Position); AuxiliaryPowerCost = powerCost; @@ -88,5 +89,8 @@ public PingingEventArgs(ReferenceHub hub, RelativePosition position, int powerCo /// Gets the player who's controlling SCP-079. /// public Player Player { get; } + + /// + public Scp079Role Scp079 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp079/RecontainedEventArgs.cs b/Exiled.Events/EventArgs/Scp079/RecontainedEventArgs.cs index 60decba4fc..b1f03021fe 100644 --- a/Exiled.Events/EventArgs/Scp079/RecontainedEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/RecontainedEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp079 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains information after SCP-079 recontainment. /// - public class RecontainedEventArgs : IPlayerEvent + public class RecontainedEventArgs : IScp079Event { /// /// Initializes a new instance of the class. @@ -25,11 +25,15 @@ public class RecontainedEventArgs : IPlayerEvent public RecontainedEventArgs(Player target) { Player = target; + Scp079 = Player.Role.As(); } /// /// Gets the player that previously controlled SCP-079. /// public Player Player { get; } + + /// + public Scp079Role Scp079 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp079/RoomBlackoutEventArgs.cs b/Exiled.Events/EventArgs/Scp079/RoomBlackoutEventArgs.cs index 24ea62074c..afd1a6ed65 100644 --- a/Exiled.Events/EventArgs/Scp079/RoomBlackoutEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/RoomBlackoutEventArgs.cs @@ -8,6 +8,7 @@ namespace Exiled.Events.EventArgs.Scp079 { using Exiled.API.Features; + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Interfaces; using MapGeneration; @@ -15,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 turns off the lights in a room. /// - public class RoomBlackoutEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent + public class RoomBlackoutEventArgs : IScp079Event, IRoomEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -41,6 +42,7 @@ public class RoomBlackoutEventArgs : IPlayerEvent, IRoomEvent, IDeniableEvent public RoomBlackoutEventArgs(ReferenceHub player, RoomIdentifier roomIdentifier, float auxiliaryPowerCost, float blackoutduration, float cooldown, bool isAllowed) { Player = Player.Get(player); + Scp079 = Player.Role.As(); Room = Room.Get(roomIdentifier); AuxiliaryPowerCost = auxiliaryPowerCost; BlackoutDuration = blackoutduration; @@ -53,6 +55,9 @@ public RoomBlackoutEventArgs(ReferenceHub player, RoomIdentifier roomIdentifier, /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the room that will be locked down. /// diff --git a/Exiled.Events/EventArgs/Scp079/StartingSpeakerEventArgs.cs b/Exiled.Events/EventArgs/Scp079/StartingSpeakerEventArgs.cs index 2a22421e4a..fc2e1fcfc8 100644 --- a/Exiled.Events/EventArgs/Scp079/StartingSpeakerEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/StartingSpeakerEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp079 { using Exiled.API.Features; + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Interfaces; /// /// Contains all information before SCP-079 uses a speaker. /// - public class StartingSpeakerEventArgs : IPlayerEvent, IDeniableEvent + public class StartingSpeakerEventArgs : IScp079Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -43,6 +44,9 @@ public StartingSpeakerEventArgs(Player player, Room room, float auxiliaryPowerCo /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the room that the speaker is located in. /// diff --git a/Exiled.Events/EventArgs/Scp079/StoppingSpeakerEventArgs.cs b/Exiled.Events/EventArgs/Scp079/StoppingSpeakerEventArgs.cs index 2ab3b9e886..b8a84fcb58 100644 --- a/Exiled.Events/EventArgs/Scp079/StoppingSpeakerEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/StoppingSpeakerEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp079 { using Exiled.API.Features; + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Interfaces; /// /// Contains all information before SCP-079 finishes using a speaker. /// - public class StoppingSpeakerEventArgs : IPlayerEvent, IDeniableEvent + public class StoppingSpeakerEventArgs : IScp079Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -30,6 +31,7 @@ public class StoppingSpeakerEventArgs : IPlayerEvent, IDeniableEvent public StoppingSpeakerEventArgs(Player player, Room room, bool isAllowed = true) { Player = player; + Scp079 = Player.Role.As(); Room = room; IsAllowed = isAllowed; } @@ -39,6 +41,9 @@ public StoppingSpeakerEventArgs(Player player, Room room, bool isAllowed = true) /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the room that the speaker is located in. /// diff --git a/Exiled.Events/EventArgs/Scp079/TriggeringDoorEventArgs.cs b/Exiled.Events/EventArgs/Scp079/TriggeringDoorEventArgs.cs index 0440bfe4da..0ca724effb 100644 --- a/Exiled.Events/EventArgs/Scp079/TriggeringDoorEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/TriggeringDoorEventArgs.cs @@ -8,9 +8,9 @@ namespace Exiled.Events.EventArgs.Scp079 { using API.Features; - + using Exiled.API.Features.Doors; using Exiled.API.Features.Roles; - + using Exiled.Events.EventArgs.Interfaces; using Interactables.Interobjects.DoorUtils; using Player; @@ -18,7 +18,7 @@ namespace Exiled.Events.EventArgs.Scp079 /// /// Contains all information before SCP-079 interacts with a door. /// - public class TriggeringDoorEventArgs : InteractingDoorEventArgs + public class TriggeringDoorEventArgs : IScp079Event, IDoorEvent, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -33,11 +33,31 @@ public class TriggeringDoorEventArgs : InteractingDoorEventArgs /// /// public TriggeringDoorEventArgs(Player player, DoorVariant door, float auxiliaryPowerCost) - : base(player, door, auxiliaryPowerCost <= player.Role.As().Energy) { + Player = player; + Scp079 = player.Role.As(); + Door = Door.Get(door); AuxiliaryPowerCost = auxiliaryPowerCost; } + /// + /// Gets or sets a value indicating whether or not the player can interact with the door. + /// + public bool IsAllowed { get; set; } = true; + + /// + /// Gets or sets the instance. + /// + public Door Door { get; set; } + + /// + /// Gets the player who's interacting with the door. + /// + public Player Player { get; } + + /// + public Scp079Role Scp079 { get; } + /// /// Gets or sets the amount of auxiliary power required to trigger a door through SCP-079. /// diff --git a/Exiled.Events/EventArgs/Scp079/ZoneBlackoutEventArgs.cs b/Exiled.Events/EventArgs/Scp079/ZoneBlackoutEventArgs.cs index 51f80118e6..d808d6ec39 100644 --- a/Exiled.Events/EventArgs/Scp079/ZoneBlackoutEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp079/ZoneBlackoutEventArgs.cs @@ -9,18 +9,17 @@ namespace Exiled.Events.EventArgs.Scp079 { using Exiled.API.Enums; using Exiled.API.Extensions; - using Exiled.API.Features; using Exiled.Events.EventArgs.Interfaces; - using MapGeneration; - using PlayerRoles.PlayableScps.Scp079; + using Scp079Role = API.Features.Roles.Scp079Role; + /// /// Contains all information before SCP-079 lockdowns a room. /// - public class ZoneBlackoutEventArgs : IPlayerEvent, IDeniableEvent + public class ZoneBlackoutEventArgs : IScp079Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -46,6 +45,7 @@ public class ZoneBlackoutEventArgs : IPlayerEvent, IDeniableEvent public ZoneBlackoutEventArgs(ReferenceHub player, FacilityZone zone, float auxiliaryPowerCost, float blackoutduration, float cooldown, Scp079HudTranslation scp079HudTranslation) { Player = Player.Get(player); + Scp079 = Player.Role.As(); Zone = zone.GetZone(); AuxiliaryPowerCost = auxiliaryPowerCost; BlackoutDuration = blackoutduration; @@ -59,6 +59,9 @@ public ZoneBlackoutEventArgs(ReferenceHub player, FacilityZone zone, float auxil /// public Player Player { get; } + /// + public Scp079Role Scp079 { get; } + /// /// Gets the of the room that will be locked down. /// diff --git a/Exiled.Events/EventArgs/Scp096/AddingTargetEventArgs.cs b/Exiled.Events/EventArgs/Scp096/AddingTargetEventArgs.cs index cac6170faa..0e801f48d6 100644 --- a/Exiled.Events/EventArgs/Scp096/AddingTargetEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/AddingTargetEventArgs.cs @@ -11,10 +11,12 @@ namespace Exiled.Events.EventArgs.Scp096 using Interfaces; + using Scp096Role = API.Features.Roles.Scp096Role; + /// /// Contains all information before adding a target to SCP-096. /// - public class AddingTargetEventArgs : IPlayerEvent, IDeniableEvent + public class AddingTargetEventArgs : IScp096Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -34,6 +36,7 @@ public class AddingTargetEventArgs : IPlayerEvent, IDeniableEvent public AddingTargetEventArgs(Player scp096, Player target, bool isForLook, bool isAllowed = true) { Player = scp096; + Scp096 = scp096.Role.As(); Target = target; IsLooking = isForLook; IsAllowed = isAllowed; @@ -44,6 +47,9 @@ public AddingTargetEventArgs(Player scp096, Player target, bool isForLook, bool /// public Player Player { get; } + /// + public Scp096Role Scp096 { get; } + /// /// Gets the being added as a target. /// diff --git a/Exiled.Events/EventArgs/Scp096/CalmingDownEventArgs.cs b/Exiled.Events/EventArgs/Scp096/CalmingDownEventArgs.cs index d0263e866e..3d75a231a6 100644 --- a/Exiled.Events/EventArgs/Scp096/CalmingDownEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/CalmingDownEventArgs.cs @@ -8,34 +8,29 @@ namespace Exiled.Events.EventArgs.Scp096 { using API.Features; - + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Interfaces; - using PlayerRoles.PlayableScps.Scp096; - /// /// Contains all information before SCP-096 calms down. /// - public class CalmingDownEventArgs : IPlayerEvent, IDeniableEvent + public class CalmingDownEventArgs : IScp096Event, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// The instance. /// The player who's controlling SCP-096. /// /// Indicates whether or not SCP-096 can calm down. - public CalmingDownEventArgs(Scp096Role scp096, Player player, bool shouldClearEnragedTimeLeft, bool isAllowed = true) + public CalmingDownEventArgs(Player player, bool shouldClearEnragedTimeLeft, bool isAllowed = true) { - Scp096 = scp096; Player = player; + Scp096 = player.Role.As(); ShouldClearEnragedTimeLeft = shouldClearEnragedTimeLeft; IsAllowed = isAllowed; } - /// - /// Gets the SCP-096 instance. - /// + /// public Scp096Role Scp096 { get; } /// diff --git a/Exiled.Events/EventArgs/Scp096/ChargingEventArgs.cs b/Exiled.Events/EventArgs/Scp096/ChargingEventArgs.cs index 56709817ed..5d26306b22 100644 --- a/Exiled.Events/EventArgs/Scp096/ChargingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/ChargingEventArgs.cs @@ -8,38 +8,31 @@ namespace Exiled.Events.EventArgs.Scp096 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; - using PlayerRoles.PlayableScps.Scp096; - /// /// Contains all information before SCP-096 charges. /// - public class ChargingEventArgs : IPlayerEvent, IDeniableEvent + public class ChargingEventArgs : IScp096Event, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// - /// - /// /// /// /// /// /// /// - public ChargingEventArgs(Scp096Role scp096, Player player, bool isAllowed = true) + public ChargingEventArgs(Player player, bool isAllowed = true) { - Scp096 = scp096; Player = player; + Scp096 = player.Role.As(); IsAllowed = isAllowed; } - /// - /// Gets the SCP-096 instance. - /// + /// public Scp096Role Scp096 { get; } /// diff --git a/Exiled.Events/EventArgs/Scp096/EnragingEventArgs.cs b/Exiled.Events/EventArgs/Scp096/EnragingEventArgs.cs index 17e78b7dff..773140c6f1 100644 --- a/Exiled.Events/EventArgs/Scp096/EnragingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/EnragingEventArgs.cs @@ -8,22 +8,17 @@ namespace Exiled.Events.EventArgs.Scp096 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; - using PlayerRoles.PlayableScps.Scp096; - /// /// Contains all information before SCP-096 gets enraged. /// - public class EnragingEventArgs : IPlayerEvent, IDeniableEvent + public class EnragingEventArgs : IScp096Event, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// - /// - /// /// /// /// @@ -33,17 +28,15 @@ public class EnragingEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - public EnragingEventArgs(Scp096Role scp096, Player player, float initialDuration, bool isAllowed = true) + public EnragingEventArgs(Player player, float initialDuration, bool isAllowed = true) { - Scp096 = scp096; Player = player; + Scp096 = player.Role.As(); InitialDuration = initialDuration; IsAllowed = isAllowed; } - /// - /// Gets the SCP-096 instance. - /// + /// public Scp096Role Scp096 { get; } /// diff --git a/Exiled.Events/EventArgs/Scp096/StartPryingGateEventArgs.cs b/Exiled.Events/EventArgs/Scp096/StartPryingGateEventArgs.cs index a26fc3ac79..87243f928d 100644 --- a/Exiled.Events/EventArgs/Scp096/StartPryingGateEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/StartPryingGateEventArgs.cs @@ -8,17 +8,17 @@ namespace Exiled.Events.EventArgs.Scp096 { using API.Features; + using API.Features.Doors; using Interactables.Interobjects; - using Interfaces; - using PlayerRoles.PlayableScps.Scp096; + using Scp096Role = API.Features.Roles.Scp096Role; /// /// Contains all information before SCP-096 begins prying a gate open. /// - public class StartPryingGateEventArgs : IPlayerEvent, IDeniableEvent, IDoorEvent + public class StartPryingGateEventArgs : IScp096Event, IDeniableEvent, IDoorEvent { /// /// Initializes a new instance of the class. @@ -26,26 +26,21 @@ public class StartPryingGateEventArgs : IPlayerEvent, IDeniableEvent, IDoorEvent /// /// /// - /// - /// - /// /// /// /// /// /// /// - public StartPryingGateEventArgs(Scp096Role scp096, Player player, PryableDoor gate, bool isAllowed = true) + public StartPryingGateEventArgs(Player player, PryableDoor gate, bool isAllowed = true) { - Scp096 = scp096; Player = player; - Door = Door.Get(gate); + Scp096 = player.Role.As(); + Gate = Door.Get(gate).As(); IsAllowed = isAllowed; } - /// - /// Gets the SCP-096 instance. - /// + /// public Scp096Role Scp096 { get; } /// @@ -54,9 +49,14 @@ public StartPryingGateEventArgs(Scp096Role scp096, Player player, PryableDoor ga public bool IsAllowed { get; set; } /// - /// Gets the to be pried open. + /// Gets the to be pried open. + /// + public Door Door => Gate; + + /// + /// Gets the to be pried open. /// - public Door Door { get; } + public Gate Gate { get; } /// /// Gets the player that is controlling SCP-096. diff --git a/Exiled.Events/EventArgs/Scp096/TryingNotToCryEventArgs.cs b/Exiled.Events/EventArgs/Scp096/TryingNotToCryEventArgs.cs index 257f42410e..a91776e618 100644 --- a/Exiled.Events/EventArgs/Scp096/TryingNotToCryEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp096/TryingNotToCryEventArgs.cs @@ -7,46 +7,39 @@ namespace Exiled.Events.EventArgs.Scp096 { - using System.Linq; - using API.Features; - using Interactables.Interobjects.DoorUtils; + using Exiled.API.Features.Doors; using Interfaces; - using PlayerRoles.PlayableScps.Scp096; - using UnityEngine; + using Scp096Role = API.Features.Roles.Scp096Role; + /// /// Contains all information before SCP-096 tries not to cry. /// - public class TryingNotToCryEventArgs : IPlayerEvent, IDoorEvent, IDeniableEvent + public class TryingNotToCryEventArgs : IScp096Event, IDoorEvent, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// - /// - /// /// /// /// /// /// /// - public TryingNotToCryEventArgs(Scp096Role scp096, Player player, bool isAllowed = true) + public TryingNotToCryEventArgs(Player player, bool isAllowed = true) { - Scp096 = scp096; Player = player; + Scp096 = player.Role.As(); GameObject = Physics.Raycast(player.CameraTransform.position, player.CameraTransform.forward, out RaycastHit hit, 1f) ? hit.collider.gameObject : null; Door = Door.Get(GameObject); IsAllowed = isAllowed; } - /// - /// Gets the SCP-096 instance. - /// + /// public Scp096Role Scp096 { get; } /// @@ -55,7 +48,7 @@ public TryingNotToCryEventArgs(Scp096Role scp096, Player player, bool isAllowed public Player Player { get; } /// - /// Gets the to be cried on. + /// Gets the to be cried on. /// the value can be null /// public Door Door { get; } diff --git a/Exiled.Events/EventArgs/Scp106/AttackingEventArgs.cs b/Exiled.Events/EventArgs/Scp106/AttackingEventArgs.cs new file mode 100644 index 0000000000..f7ea11cc02 --- /dev/null +++ b/Exiled.Events/EventArgs/Scp106/AttackingEventArgs.cs @@ -0,0 +1,51 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Scp106 +{ + using Exiled.API.Features; + using Exiled.API.Features.Roles; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// Contains all information before SCP-106 attacks player. + /// + public class AttackingEventArgs : IScp106Event, IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + public AttackingEventArgs(Player player, Player target, bool isAllowed = true) + { + Player = player; + Scp106 = Player.Role.As(); + Target = target; + IsAllowed = isAllowed; + } + + /// + /// Gets the player controlling SCP-106. + /// + public Player Player { get; } + + /// + public Scp106Role Scp106 { get; } + + /// + /// Gets the target of attack. + /// + public Player Target { get; } + + /// + /// Gets or sets a value indicating whether or not target can be attacked. + /// + public bool IsAllowed { get; set; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp106/StalkingEventArgs.cs b/Exiled.Events/EventArgs/Scp106/StalkingEventArgs.cs index 534a297bdc..e8626b036e 100644 --- a/Exiled.Events/EventArgs/Scp106/StalkingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp106/StalkingEventArgs.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -13,10 +13,12 @@ namespace Exiled.Events.EventArgs.Scp106 using PlayerRoles.PlayableScps.Scp106; + using Scp106Role = API.Features.Roles.Scp106Role; + /// /// Contains all information before SCP-106 use the stalk ability. /// - public class StalkingEventArgs : IPlayerEvent, IDeniableEvent + public class StalkingEventArgs : IScp106Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -27,9 +29,10 @@ public class StalkingEventArgs : IPlayerEvent, IDeniableEvent public StalkingEventArgs(Player player, Scp106StalkAbility scp106StalkAbility, bool isAllowed = true) { Player = player; + Scp106 = Player.Role.As(); Scp106StalkAbility = scp106StalkAbility; IsAllowed = isAllowed; - Vigor = scp106StalkAbility.Vigor.VigorAmount; + Vigor = scp106StalkAbility.Vigor.CurValue; MinimumVigor = Scp106StalkAbility.MinVigorToSubmerge; } @@ -53,6 +56,9 @@ public StalkingEventArgs(Player player, Scp106StalkAbility scp106StalkAbility, b /// public Player Player { get; } + /// + public Scp106Role Scp106 { get; } + /// /// Gets or sets a value indicating whether or not SCP-106 can stalk. /// diff --git a/Exiled.Events/EventArgs/Scp106/TeleportingEventArgs.cs b/Exiled.Events/EventArgs/Scp106/TeleportingEventArgs.cs index f0b20503ca..7d6fba298a 100644 --- a/Exiled.Events/EventArgs/Scp106/TeleportingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp106/TeleportingEventArgs.cs @@ -8,7 +8,7 @@ namespace Exiled.Events.EventArgs.Scp106 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; using UnityEngine; @@ -16,7 +16,7 @@ namespace Exiled.Events.EventArgs.Scp106 /// /// Contains all information before SCP-106 teleports using the hunter atlas. /// - public class TeleportingEventArgs : IPlayerEvent, IDeniableEvent + public class TeleportingEventArgs : IScp106Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -33,6 +33,7 @@ public class TeleportingEventArgs : IPlayerEvent, IDeniableEvent public TeleportingEventArgs(Player player, Vector3 position, bool isAllowed = true) { Player = player; + Scp106 = Player.Role.As(); Position = position; IsAllowed = isAllowed; } @@ -51,5 +52,8 @@ public TeleportingEventArgs(Player player, Vector3 position, bool isAllowed = tr /// Gets the player who's controlling SCP-106. /// public Player Player { get; } + + /// + public Scp106Role Scp106 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp173/BlinkingEventArgs.cs b/Exiled.Events/EventArgs/Scp173/BlinkingEventArgs.cs index 8ec97c10e4..3a93bd4f1c 100644 --- a/Exiled.Events/EventArgs/Scp173/BlinkingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp173/BlinkingEventArgs.cs @@ -17,10 +17,12 @@ namespace Exiled.Events.EventArgs.Scp173 using UnityEngine; + using Scp173Role = API.Features.Roles.Scp173Role; + /// /// Contains all information before a players blink near SCP-173. /// - public class BlinkingEventArgs : IPlayerEvent, IDeniableEvent + public class BlinkingEventArgs : IScp173Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -37,6 +39,7 @@ public class BlinkingEventArgs : IPlayerEvent, IDeniableEvent public BlinkingEventArgs(Player player, List targets, Vector3 blinkPos) { Player = player; + Scp173 = player.Role.As(); BlinkPosition = blinkPos; Targets = targets; BlinkCooldown = Scp173BlinkTimer.CooldownBaseline; @@ -66,5 +69,8 @@ public BlinkingEventArgs(Player player, List targets, Vector3 blinkPos) /// Gets the player who controlling SCP-173. /// public Player Player { get; } + + /// + public Scp173Role Scp173 { get; } } } diff --git a/Exiled.Events/EventArgs/Scp173/PlacingTantrumEventArgs.cs b/Exiled.Events/EventArgs/Scp173/PlacingTantrumEventArgs.cs index 95934d6ed2..26d13636eb 100644 --- a/Exiled.Events/EventArgs/Scp173/PlacingTantrumEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp173/PlacingTantrumEventArgs.cs @@ -8,6 +8,7 @@ namespace Exiled.Events.EventArgs.Scp173 { using Exiled.API.Features; + using Exiled.API.Features.Roles; using Exiled.Events.EventArgs.Interfaces; using Hazards; @@ -15,17 +16,16 @@ namespace Exiled.Events.EventArgs.Scp173 using PlayerRoles.PlayableScps.Scp173; using PlayerRoles.PlayableScps.Subroutines; + using Scp173Role = API.Features.Roles.Scp173Role; + /// /// Contains all information before the tantrum is placed. /// - public class PlacingTantrumEventArgs : IPlayerEvent, IDeniableEvent + public class PlacingTantrumEventArgs : IScp173Event, IDeniableEvent { /// /// Initializes a new instance of the class. /// - /// - /// - /// /// /// /// @@ -38,10 +38,10 @@ public class PlacingTantrumEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - public PlacingTantrumEventArgs(Scp173Role scp173, Player player, TantrumEnvironmentalHazard tantrumHazard, AbilityCooldown cooldown, bool isAllowed = true) + public PlacingTantrumEventArgs(Player player, TantrumEnvironmentalHazard tantrumHazard, AbilityCooldown cooldown, bool isAllowed = true) { - Scp173 = scp173; Player = player; + Scp173 = Player.Role.As(); TantrumHazard = tantrumHazard; Cooldown = cooldown; IsAllowed = isAllowed; diff --git a/Exiled.Events/EventArgs/Scp173/UsingBreakneckSpeedsEventArgs.cs b/Exiled.Events/EventArgs/Scp173/UsingBreakneckSpeedsEventArgs.cs index 43133efb95..9b712ae4f6 100644 --- a/Exiled.Events/EventArgs/Scp173/UsingBreakneckSpeedsEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp173/UsingBreakneckSpeedsEventArgs.cs @@ -8,13 +8,13 @@ namespace Exiled.Events.EventArgs.Scp173 { using API.Features; - + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before an Scp-173 uses breakneck speeds. /// - public class UsingBreakneckSpeedsEventArgs : IPlayerEvent, IDeniableEvent + public class UsingBreakneckSpeedsEventArgs : IScp173Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -28,6 +28,7 @@ public class UsingBreakneckSpeedsEventArgs : IPlayerEvent, IDeniableEvent public UsingBreakneckSpeedsEventArgs(Player player, bool isAllowed = true) { Player = player; + Scp173 = player.Role.As(); IsAllowed = isAllowed; } @@ -40,5 +41,8 @@ public UsingBreakneckSpeedsEventArgs(Player player, bool isAllowed = true) /// Gets the player who's using breakneck speeds. /// public Player Player { get; } + + /// + public Scp173Role Scp173 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/ChangingFocusEventArgs.cs b/Exiled.Events/EventArgs/Scp939/ChangingFocusEventArgs.cs index 888e4237e6..0d7e4f3bb4 100644 --- a/Exiled.Events/EventArgs/Scp939/ChangingFocusEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/ChangingFocusEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp939 { using API.Features; + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-939 changes its target focus. /// - public class ChangingFocusEventArgs : IPlayerEvent, IDeniableEvent + public class ChangingFocusEventArgs : IScp939Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -30,6 +31,7 @@ public class ChangingFocusEventArgs : IPlayerEvent, IDeniableEvent public ChangingFocusEventArgs(ReferenceHub player, bool state, bool isAllowed = true) { Player = Player.Get(player); + Scp939 = Player.Role.As(); State = state; IsAllowed = isAllowed; } @@ -48,5 +50,8 @@ public ChangingFocusEventArgs(ReferenceHub player, bool state, bool isAllowed = /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/ClawedEventArgs.cs b/Exiled.Events/EventArgs/Scp939/ClawedEventArgs.cs new file mode 100644 index 0000000000..9430a1c7dc --- /dev/null +++ b/Exiled.Events/EventArgs/Scp939/ClawedEventArgs.cs @@ -0,0 +1,37 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Scp939 +{ + using API.Features; + using Exiled.API.Features.Roles; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// Contains all information after SCP-939 attacks. + /// + public class ClawedEventArgs : IScp939Event + { + /// + /// Initializes a new instance of the class. + /// + /// + public ClawedEventArgs(Player player) + { + Player = player; + Scp939 = Player.Role.As(); + } + + /// + /// Gets the SCP-939. + /// + public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/LungingEventArgs.cs b/Exiled.Events/EventArgs/Scp939/LungingEventArgs.cs index d5090f6fd4..21057b5bf2 100644 --- a/Exiled.Events/EventArgs/Scp939/LungingEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/LungingEventArgs.cs @@ -7,13 +7,16 @@ namespace Exiled.Events.EventArgs.Scp939 { + using System; + using API.Features; + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-939 uses its lunge ability. /// - public class LungingEventArgs : IPlayerEvent, IDeniableEvent + public class LungingEventArgs : IScp939Event { /// /// Initializes a new instance of the class. @@ -21,23 +24,18 @@ public class LungingEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - /// - /// - /// - public LungingEventArgs(ReferenceHub player, bool isAllowed = true) + public LungingEventArgs(ReferenceHub player) { Player = Player.Get(player); - IsAllowed = isAllowed; + Scp939 = Player.Role.As(); } - /// - /// Gets or sets a value indicating whether or not SCP-939 can lunge. - /// - public bool IsAllowed { get; set; } - /// /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Scp939/PlacingAmnesticCloudEventArgs.cs b/Exiled.Events/EventArgs/Scp939/PlacingAmnesticCloudEventArgs.cs index e7ffa05420..e8cbb7a728 100644 --- a/Exiled.Events/EventArgs/Scp939/PlacingAmnesticCloudEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/PlacingAmnesticCloudEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp939 { using API.Features; + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-939 uses its amnestic cloud ability. /// - public class PlacingAmnesticCloudEventArgs : IPlayerEvent, IDeniableEvent + public class PlacingAmnesticCloudEventArgs : IScp939Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -36,6 +37,7 @@ public class PlacingAmnesticCloudEventArgs : IPlayerEvent, IDeniableEvent public PlacingAmnesticCloudEventArgs(ReferenceHub player, bool state, bool isReady, float cooldown, bool isAllowed = true) { Player = Player.Get(player); + Scp939 = Player.Role.As(); State = state; IsReady = isReady; Cooldown = cooldown; @@ -66,5 +68,8 @@ public PlacingAmnesticCloudEventArgs(ReferenceHub player, bool state, bool isRea /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/PlayingSoundEventArgs.cs b/Exiled.Events/EventArgs/Scp939/PlayingSoundEventArgs.cs index 6a05ae430d..dcf11b56f0 100644 --- a/Exiled.Events/EventArgs/Scp939/PlayingSoundEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/PlayingSoundEventArgs.cs @@ -8,13 +8,14 @@ namespace Exiled.Events.EventArgs.Scp939 { using API.Features; + using Exiled.API.Features.Roles; using Interfaces; using PlayerRoles.PlayableScps.Scp939.Mimicry; /// /// Contains all information before SCP-939 plays a sound effect. /// - public class PlayingSoundEventArgs : IPlayerEvent, IDeniableEvent + public class PlayingSoundEventArgs : IScp939Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -34,9 +35,10 @@ public class PlayingSoundEventArgs : IPlayerEvent, IDeniableEvent /// /// /// - public PlayingSoundEventArgs(ReferenceHub player, EnvMimicryOption sound, bool isReady, float cooldown, bool isAllowed = true) + public PlayingSoundEventArgs(ReferenceHub player, EnvMimicrySequence sound, bool isReady, float cooldown, bool isAllowed = true) { Player = Player.Get(player); + Scp939 = Player.Role.As(); Sound = sound; IsReady = isReady; Cooldown = cooldown; @@ -52,7 +54,7 @@ public PlayingSoundEventArgs(ReferenceHub player, EnvMimicryOption sound, bool i /// /// Gets the sound being played. /// - public EnvMimicryOption Sound { get; } + public EnvMimicrySequence Sound { get; } /// /// Gets a value indicating whether or not SCP-939's environmental mimicry cooldown is ready. @@ -68,5 +70,8 @@ public PlayingSoundEventArgs(ReferenceHub player, EnvMimicryOption sound, bool i /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/PlayingVoiceEventArgs.cs b/Exiled.Events/EventArgs/Scp939/PlayingVoiceEventArgs.cs index 25ff1cbaae..cba8a9b257 100644 --- a/Exiled.Events/EventArgs/Scp939/PlayingVoiceEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/PlayingVoiceEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp939 { using API.Features; + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-939 plays a stolen player's voice. /// - public class PlayingVoiceEventArgs : IPlayerEvent, IDeniableEvent + public class PlayingVoiceEventArgs : IScp939Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -27,6 +28,7 @@ public class PlayingVoiceEventArgs : IPlayerEvent, IDeniableEvent public PlayingVoiceEventArgs(ReferenceHub player, ReferenceHub stolen) { Player = Player.Get(player); + Scp939 = Player.Role.As(); Stolen = Player.Get(stolen); } @@ -44,5 +46,8 @@ public PlayingVoiceEventArgs(ReferenceHub player, ReferenceHub stolen) /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Scp939/SavingVoiceEventArgs.cs b/Exiled.Events/EventArgs/Scp939/SavingVoiceEventArgs.cs index 8eb31022b3..08f78eafa9 100644 --- a/Exiled.Events/EventArgs/Scp939/SavingVoiceEventArgs.cs +++ b/Exiled.Events/EventArgs/Scp939/SavingVoiceEventArgs.cs @@ -8,12 +8,13 @@ namespace Exiled.Events.EventArgs.Scp939 { using API.Features; + using Exiled.API.Features.Roles; using Interfaces; /// /// Contains all information before SCP-939 plays a stolen player's voice. /// - public class SavingVoiceEventArgs : IPlayerEvent, IDeniableEvent + public class SavingVoiceEventArgs : IScp939Event, IDeniableEvent { /// /// Initializes a new instance of the class. @@ -30,6 +31,7 @@ public class SavingVoiceEventArgs : IPlayerEvent, IDeniableEvent public SavingVoiceEventArgs(ReferenceHub player, ReferenceHub stolen, bool isAllowed = true) { Player = Player.Get(player); + Scp939 = Player.Role.As(); Stolen = Player.Get(stolen); IsAllowed = isAllowed; } @@ -48,5 +50,8 @@ public SavingVoiceEventArgs(ReferenceHub player, ReferenceHub stolen, bool isAll /// Gets the player who's controlling SCP-939. /// public Player Player { get; } + + /// + public Scp939Role Scp939 { get; } } } \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Server/ChoosingStartTeamQueueEventArgs.cs b/Exiled.Events/EventArgs/Server/ChoosingStartTeamQueueEventArgs.cs new file mode 100644 index 0000000000..a533c10efb --- /dev/null +++ b/Exiled.Events/EventArgs/Server/ChoosingStartTeamQueueEventArgs.cs @@ -0,0 +1,64 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Server +{ + using System; + using System.Collections.Generic; + using System.Text; + + using Exiled.API.Features.Pools; + using Interfaces; + using PlayerRoles; + + /// + /// Contains all information before a spectator changes the spectated player. + /// + public class ChoosingStartTeamQueueEventArgs : IDeniableEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + public ChoosingStartTeamQueueEventArgs(string teamRespawnQueue) + { + TeamRespawnQueue = new(); + foreach (char ch in teamRespawnQueue) + { + Team team = (Team)(ch - '0'); + if (Enum.IsDefined(typeof(Team), team)) + TeamRespawnQueue.Add(team); + } + } + + /// + /// Gets the TeamRespawnQueue. + /// + public List TeamRespawnQueue { get; } + + /// + /// Gets or sets a value indicating whether the event can continue. + /// + public bool IsAllowed { get; set; } = true; + + /// + /// Gets the TeamRespawnQueue in a string value. + /// + /// The actual modified TeamRespawnQueue. + internal string GetTeamRespawnQueue() + { + StringBuilder teamRespawnQueue = StringBuilderPool.Pool.Get(); + + foreach (Team team in TeamRespawnQueue) + teamRespawnQueue.Append((int)team); + + return StringBuilderPool.Pool.ToStringReturn(teamRespawnQueue); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/EventArgs/Server/RespawningTeamEventArgs.cs b/Exiled.Events/EventArgs/Server/RespawningTeamEventArgs.cs index d62745b957..6da3311c4d 100644 --- a/Exiled.Events/EventArgs/Server/RespawningTeamEventArgs.cs +++ b/Exiled.Events/EventArgs/Server/RespawningTeamEventArgs.cs @@ -12,6 +12,8 @@ namespace Exiled.Events.EventArgs.Server using Exiled.API.Features; using Exiled.Events.EventArgs.Interfaces; + using PlayerRoles; + using Respawning; /// @@ -21,6 +23,7 @@ namespace Exiled.Events.EventArgs.Server public class RespawningTeamEventArgs : IDeniableEvent { private SpawnableTeamType nextKnownTeam; + private int maximumRespawnAmount; /// /// Initializes a new instance of the class. @@ -43,6 +46,8 @@ public RespawningTeamEventArgs(List players, int maxRespawn, SpawnableTe MaximumRespawnAmount = maxRespawn; this.nextKnownTeam = nextKnownTeam; + SpawnQueue = new(); + SpawnableTeam.GenerateQueue(SpawnQueue, players.Count); IsAllowed = isAllowed; } @@ -54,7 +59,20 @@ public RespawningTeamEventArgs(List players, int maxRespawn, SpawnableTe /// /// Gets or sets the maximum amount of respawnable players. /// - public int MaximumRespawnAmount { get; set; } + public int MaximumRespawnAmount + { + get => maximumRespawnAmount; + set + { + if (value < maximumRespawnAmount) + { + if (Players.Count > value) + Players.RemoveRange(value, Players.Count - value); + } + + maximumRespawnAmount = value; + } + } /// /// Gets or sets a value indicating what the next respawnable team is. @@ -73,6 +91,8 @@ public SpawnableTeamType NextKnownTeam } MaximumRespawnAmount = spawnableTeam.MaxWaveSize; + if (RespawnManager.SpawnableTeams.TryGetValue(nextKnownTeam, out SpawnableTeamHandlerBase @base)) + @base.GenerateQueue(SpawnQueue, Players.Count); } } @@ -86,5 +106,10 @@ public SpawnableTeamHandlerBase SpawnableTeam /// Gets or sets a value indicating whether or not the spawn can occur. /// public bool IsAllowed { get; set; } + + /// + /// Gets or sets the RoleTypeId spawn queue. + /// + public Queue SpawnQueue { get; set; } } -} \ No newline at end of file +} diff --git a/Exiled.Events/EventArgs/Warhead/StartingEventArgs.cs b/Exiled.Events/EventArgs/Warhead/StartingEventArgs.cs index 5867b358ab..030802121d 100644 --- a/Exiled.Events/EventArgs/Warhead/StartingEventArgs.cs +++ b/Exiled.Events/EventArgs/Warhead/StartingEventArgs.cs @@ -18,15 +18,17 @@ public class StartingEventArgs : StoppingEventArgs /// Initializes a new instance of the class. /// /// The player who's going to start the warhead. + /// Indicating whether or not the nuke was set off automatically. /// Indicating whether the event can be executed or not. - public StartingEventArgs(Player player, bool isAllowed = true) + public StartingEventArgs(Player player, bool isAuto, bool isAllowed = true) : base(player, isAllowed) { + IsAuto = isAuto; } /// - /// Gets a value indicating whether or not the nuke was set off automatically. + /// Gets or sets a value indicating whether or not the nuke was set off automatically. /// - public bool IsAuto { get; } = AlphaWarheadController.Singleton._autoDetonate && (AlphaWarheadController.Singleton._autoDetonateTime <= 0); + public bool IsAuto { get; set; } } } \ No newline at end of file diff --git a/Exiled.Events/Events.cs b/Exiled.Events/Events.cs index 872eb9907e..447ff60739 100644 --- a/Exiled.Events/Events.cs +++ b/Exiled.Events/Events.cs @@ -14,16 +14,16 @@ namespace Exiled.Events using API.Enums; using API.Features; - using EventArgs.Interfaces; - + using Exiled.API.Features.Pickups; + using Exiled.Events.Features; using HarmonyLib; + using InventorySystem.Items.Pickups; + using InventorySystem.Items.Usables; - using PlayerRoles.FirstPersonControl.Thirdperson; using PlayerRoles.Ragdolls; using PlayerRoles.RoleAssign; using PluginAPI.Events; - using UnityEngine.SceneManagement; /// @@ -33,41 +33,18 @@ public sealed class Events : Plugin { private static Events instance; - /// - /// The below variable is used to increment the name of the harmony instance, otherwise harmony will not work upon a plugin reload. - /// - private int patchesCounter; - - /// - /// The custom delegate. - /// - /// The type. - /// The instance. - public delegate void CustomEventHandler(TInterface ev) - where TInterface : IExiledEvent; - - /// - /// The custom delegate, with empty parameters. - /// - public delegate void CustomEventHandler(); - /// /// Gets the plugin instance. /// public static Events Instance => instance; - /// - /// Gets a set of types and methods for which EXILED patches should not be run. - /// - public static HashSet DisabledPatchesHashSet { get; } = new(); - /// public override PluginPriority Priority { get; } = PluginPriority.First; /// - /// Gets the instance. + /// Gets the used to employ all patches. /// - public Harmony Harmony { get; private set; } + public Patcher Patcher { get; private set; } /// public override void OnEnabled() @@ -81,30 +58,29 @@ public override void OnEnabled() watch.Stop(); - Log.Info($"Patching completed in {watch.Elapsed}"); + Log.Info($"{(Config.UseDynamicPatching ? "Non-event" : "All")} patches completed in {watch.Elapsed}"); CharacterClassManager.OnInstanceModeChanged -= RoleAssigner.CheckLateJoin; SceneManager.sceneUnloaded += Handlers.Internal.SceneUnloaded.OnSceneUnloaded; MapGeneration.SeedSynchronizer.OnMapGenerated += Handlers.Internal.MapGenerated.OnMapGenerated; - + UsableItemsController.ServerOnUsingCompleted += (hub, usable) => Handlers.Player.OnUsedItem(new(hub, usable)); Handlers.Server.WaitingForPlayers += Handlers.Internal.Round.OnWaitingForPlayers; Handlers.Server.RestartingRound += Handlers.Internal.Round.OnRestartingRound; Handlers.Server.RoundStarted += Handlers.Internal.Round.OnRoundStarted; Handlers.Player.ChangingRole += Handlers.Internal.Round.OnChangingRole; Handlers.Player.Verified += Handlers.Internal.Round.OnVerified; + Handlers.Map.ChangedIntoGrenade += Handlers.Internal.ExplodingGrenade.OnChangedIntoGrenade; CharacterClassManager.OnRoundStarted += Handlers.Server.OnRoundStarted; InventorySystem.InventoryExtensions.OnItemAdded += Handlers.Player.OnItemAdded; - AnimatedCharacterModel.OnFootstepPlayed += Handlers.Player.OnMakingNoise; - RagdollManager.OnRagdollSpawned += Handlers.Internal.RagdollList.OnSpawnedRagdoll; RagdollManager.OnRagdollRemoved += Handlers.Internal.RagdollList.OnRemovedRagdoll; - + ItemPickupBase.OnPickupAdded += Handlers.Internal.PickupEvent.OnSpawnedPickup; + ItemPickupBase.OnPickupDestroyed += Handlers.Internal.PickupEvent.OnRemovedPickup; ServerConsole.ReloadServerName(); - EventManager.RegisterEvents(this); EventManager.RegisterEvents(this); } @@ -115,8 +91,6 @@ public override void OnDisabled() Unpatch(); - DisabledPatchesHashSet.Clear(); - SceneManager.sceneUnloaded -= Handlers.Internal.SceneUnloaded.OnSceneUnloaded; MapGeneration.SeedSynchronizer.OnMapGenerated -= Handlers.Map.OnGenerated; @@ -125,17 +99,15 @@ public override void OnDisabled() Handlers.Server.RoundStarted -= Handlers.Internal.Round.OnRoundStarted; Handlers.Player.ChangingRole -= Handlers.Internal.Round.OnChangingRole; Handlers.Player.Verified -= Handlers.Internal.Round.OnVerified; + Handlers.Map.ChangedIntoGrenade -= Handlers.Internal.ExplodingGrenade.OnChangedIntoGrenade; CharacterClassManager.OnRoundStarted -= Handlers.Server.OnRoundStarted; InventorySystem.InventoryExtensions.OnItemAdded -= Handlers.Player.OnItemAdded; - AnimatedCharacterModel.OnFootstepPlayed -= Handlers.Player.OnMakingNoise; - RagdollManager.OnRagdollSpawned -= Handlers.Internal.RagdollList.OnSpawnedRagdoll; RagdollManager.OnRagdollRemoved -= Handlers.Internal.RagdollList.OnRemovedRagdoll; - EventManager.UnregisterEvents(this); EventManager.UnregisterEvents(this); } @@ -146,12 +118,13 @@ public void Patch() { try { - Harmony = new Harmony($"exiled.events.{++patchesCounter}"); + Patcher = new Patcher(); #if DEBUG bool lastDebugStatus = Harmony.DEBUG; Harmony.DEBUG = true; #endif - PatchByAttributes(out int failedPatch); + Patcher.PatchAll(!Config.UseDynamicPatching, out int failedPatch); + if (failedPatch == 0) Log.Debug("Events patched successfully!"); else @@ -166,48 +139,15 @@ public void Patch() } } - /// - /// Checks the list and un-patches any methods that have been defined there. Once un-patching has been done, they can be patched by plugins, but will not be re-patchable by Exiled until a server reboot. - /// - public void ReloadDisabledPatches() - { - foreach (MethodBase method in DisabledPatchesHashSet) - { - Harmony.Unpatch(method, HarmonyPatchType.All, Harmony.Id); - - Log.Info($"Unpatched {method.Name}"); - } - } - /// /// Unpatches all events. /// public void Unpatch() { Log.Debug("Unpatching events..."); - Harmony.UnpatchAll(); - + Patcher.UnpatchAll(); + Patcher = null; Log.Debug("All events have been unpatched complete. Goodbye!"); } - - private void PatchByAttributes(out int failedPatch) - { - failedPatch = 0; - foreach (Type type in AccessTools.GetTypesFromAssembly(Assembly.GetExecutingAssembly())) - { - try - { - Harmony.CreateClassProcessor(type).Patch(); - } - catch (Exception exception) - { - Log.Error($"Patching by attributes failed!\n{exception}"); - failedPatch++; - continue; - } - } - - Log.Debug("Events patched by attributes successfully!"); - } } } \ No newline at end of file diff --git a/Exiled.Events/Exiled.Events.csproj b/Exiled.Events/Exiled.Events.csproj index 8a68a88307..421dc0108a 100644 --- a/Exiled.Events/Exiled.Events.csproj +++ b/Exiled.Events/Exiled.Events.csproj @@ -19,15 +19,14 @@ - - + @@ -36,6 +35,7 @@ + diff --git a/Exiled.Events/Extensions/Event.cs b/Exiled.Events/Extensions/Event.cs deleted file mode 100644 index 2600a90f4f..0000000000 --- a/Exiled.Events/Extensions/Event.cs +++ /dev/null @@ -1,85 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Extensions -{ - using System; - - using API.Features; - - using EventArgs.Interfaces; - - /// - /// A set of tools to execute events safely and without breaking other plugins. - /// - public static class Event - { - /// - /// Executes all listeners safely. - /// - /// Event arg type. - /// Source event. - /// Event arg. - /// Event or its arg is . - /// Returns a value indicating whether the game code after the event is allowed to be executed or not. - public static bool InvokeSafely(this Events.CustomEventHandler ev, T arg) - where T : IExiledEvent - { - if (ev is null) - return true; - - string eventName = ev.GetType().FullName; - - foreach (Delegate @delegate in ev.GetInvocationList()) - { - try - { - Events.CustomEventHandler handler = (Events.CustomEventHandler)@delegate; - handler(arg); - } - catch (Exception ex) - { - LogException(ex, @delegate.Method.Name, @delegate.Method.ReflectedType?.FullName, eventName); - } - } - - return arg is not IDeniableEvent deniableEv || deniableEv.IsAllowed; - } - - /// - /// Executes all listeners safely. - /// - /// Source event. - /// Event is . - public static void InvokeSafely(this Events.CustomEventHandler ev) - { - if (ev is null) - return; - - string eventName = ev.GetType().FullName; - - foreach (Delegate @delegate in ev.GetInvocationList()) - { - try - { - Events.CustomEventHandler handler = (Events.CustomEventHandler)@delegate; - handler(); - } - catch (Exception ex) - { - LogException(ex, @delegate.Method.Name, @delegate.Method.ReflectedType?.FullName, eventName); - } - } - } - - private static void LogException(Exception ex, string methodName, string sourceClassName, string eventName) - { - Log.Error($"Method \"{methodName}\" of the class \"{sourceClassName}\" caused an exception when handling the event \"{eventName}\""); - Log.Error(ex); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Features/Event.cs b/Exiled.Events/Features/Event.cs new file mode 100644 index 0000000000..9c8eba4ef4 --- /dev/null +++ b/Exiled.Events/Features/Event.cs @@ -0,0 +1,108 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Features +{ + using System; + using System.Linq; + + using Exiled.API.Features; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// The custom delegate, with empty parameters. + /// + public delegate void CustomEventHandler(); + + /// + /// An implementation of that encapsulates a no-argument event. + /// + public class Event : IExiledEvent + { + private bool patched; + + /// + /// Initializes a new instance of the class. + /// + public Event() + { + } + + private event CustomEventHandler InnerEvent; + + /// + /// Subscribes a to the inner event, and checks patches if dynamic patching is enabled. + /// + /// The to subscribe the to. + /// The to subscribe to the . + /// The with the handler added to it. + public static Event operator +(Event @event, CustomEventHandler handler) + { + @event.Subscribe(handler); + return @event; + } + + /// + /// Unsubscribes a target from the inner event, and checks if unpatching is possible, if dynamic patching is enabled. + /// + /// The the will be unsubscribed from. + /// The that will be unsubscribed from the . + /// The with the handler unsubscribed from it. + public static Event operator -(Event @event, CustomEventHandler handler) + { + @event.Unsubscribe(handler); + return @event; + } + + /// + /// Subscribes a target to the inner event if the conditional is true. + /// + /// The handler to add. + public void Subscribe(CustomEventHandler handler) + { + Log.Assert(Events.Instance is not null, $"{nameof(Events.Instance)} is null, please ensure you have exiled_events enabled!"); + + if (Events.Instance.Config.UseDynamicPatching && !patched) + { + Events.Instance.Patcher.Patch(this); + patched = true; + } + + InnerEvent += handler; + } + + /// + /// Unsubscribes a target from the inner event if the conditional is true. + /// + /// The handler to add. + public void Unsubscribe(CustomEventHandler handler) + { + InnerEvent -= handler; + } + + /// + /// Executes all listeners safely. + /// + public void InvokeSafely() + { + if (InnerEvent is null) + return; + + foreach (CustomEventHandler handler in InnerEvent.GetInvocationList().Cast()) + { + try + { + handler(); + } + catch (Exception ex) + { + Log.Error($"Method \"{handler.Method.Name}\" of the class \"{handler.Method.ReflectedType.FullName}\" caused an exception when handling the event \"{GetType().FullName}\"\n{ex}"); + } + } + } + } +} diff --git a/Exiled.Events/Features/Event{T}.cs b/Exiled.Events/Features/Event{T}.cs new file mode 100644 index 0000000000..49853113e3 --- /dev/null +++ b/Exiled.Events/Features/Event{T}.cs @@ -0,0 +1,113 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Features +{ + using System; + using System.Linq; + + using Exiled.API.Features; + using Exiled.Events.EventArgs.Interfaces; + + /// + /// The custom delegate. + /// + /// The type. + /// The instance. + public delegate void CustomEventHandler(TEventArgs ev); + + /// + /// An implementation of the interface that encapsulates an event with arguments. + /// + /// The specified that the event will use. + public class Event : IExiledEvent + { + private bool patched; + + /// + /// Initializes a new instance of the class. + /// + public Event() + { + } + + private event CustomEventHandler InnerEvent; + + /// + /// Subscribes a target to the inner event and checks if patching is possible, if dynamic patching is enabled. + /// + /// The the will be subscribed to. + /// The that will be subscribed to the . + /// The with the handler subscribed to it. + public static Event operator +(Event @event, CustomEventHandler handler) + { + @event.Subscribe(handler); + return @event; + } + + /// + /// Unsubscribes a target from the inner event and checks if unpatching is possible, if dynamic patching is enabled. + /// + /// The the will be unsubscribed from. + /// The that will be unsubscribed from the . + /// The with the handler unsubscribed from it. + public static Event operator -(Event @event, CustomEventHandler handler) + { + @event.Unsubscribe(handler); + return @event; + } + + /// + /// Subscribes a target to the inner event if the conditional is true. + /// + /// The handler to add. + public void Subscribe(CustomEventHandler handler) + { + Log.Assert(Events.Instance is not null, $"{nameof(Events.Instance)} is null, please ensure you have exiled_events enabled!"); + + if (Events.Instance.Config.UseDynamicPatching && !patched) + { + Events.Instance.Patcher.Patch(this); + patched = true; + } + + InnerEvent += handler; + } + + /// + /// Unsubscribes a target from the inner event if the conditional is true. + /// + /// The handler to add. + public void Unsubscribe(CustomEventHandler handler) + { + InnerEvent -= handler; + } + + /// + /// Executes all listeners safely. + /// + /// The event arg/>. + /// Event or its arg is . + public void InvokeSafely(T arg) + { + if (InnerEvent is null) + return; + + foreach (CustomEventHandler handler in InnerEvent.GetInvocationList().Cast>()) + { + try + { + handler(arg); + } + catch (Exception ex) + { + Log.Error($"Method \"{handler.Method.Name}\" of the class \"{handler.Method.ReflectedType.FullName}\" caused an exception when handling the event \"{GetType().FullName}\"\n{ex}"); + } + } + } + } +} diff --git a/Exiled.Events/Features/Patcher.cs b/Exiled.Events/Features/Patcher.cs new file mode 100644 index 0000000000..4d3377e077 --- /dev/null +++ b/Exiled.Events/Features/Patcher.cs @@ -0,0 +1,158 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Features +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Interfaces; + using HarmonyLib; + using UnityEngine; + + /// + /// A tool for patching. + /// + public class Patcher + { + /// + /// The below variable is used to increment the name of the harmony instance, otherwise harmony will not work upon a plugin reload. + /// + private static int patchesCounter; + + /// + /// Initializes a new instance of the class. + /// + internal Patcher() + { + Harmony = new($"exiled.events.{++patchesCounter}"); + } + + /// + /// Gets a that contains all patch types that haven't been patched. + /// + public static HashSet UnpatchedTypes { get; private set; } = GetAllPatchTypes(); + + /// + /// Gets a set of types and methods for which EXILED patches should not be run. + /// + public static HashSet DisabledPatchesHashSet { get; } = new(); + + /// + /// Gets the instance. + /// + public Harmony Harmony { get; } + + /// + /// Patches all events that target a specific . + /// + /// The all matching patches should target. + public void Patch(IExiledEvent @event) + { + try + { + List types = ListPool.Pool.Get(UnpatchedTypes.Where(x => x.GetCustomAttributes().Any((epa) => epa.Event == @event))); + + foreach (Type type in types) + { + List methodInfos = new PatchClassProcessor(Harmony, type).Patch(); + if (DisabledPatchesHashSet.Any(x => methodInfos.Contains(x))) + ReloadDisabledPatches(); + UnpatchedTypes.Remove(type); + } + + ListPool.Pool.Return(types); + } + catch (Exception ex) + { + Log.Error($"Patching by event failed!\n{ex}"); + } + } + + /// + /// Patches all events. + /// + /// Whether to patch events as well as all required patches. + /// the number of failed patch returned. + public void PatchAll(bool includeEvents, out int failedPatch) + { + failedPatch = 0; + + try + { +#if DEBUG + bool lastDebugStatus = Harmony.DEBUG; + Harmony.DEBUG = true; +#endif + List toPatch = ListPool.Pool.Get(includeEvents ? UnpatchedTypes : UnpatchedTypes.Where((type) => !type.GetCustomAttributes().Any())); + for (int i = 0; i < toPatch.Count; i++) + { + Type patch = toPatch[i]; + try + { + Harmony.CreateClassProcessor(patch).Patch(); + UnpatchedTypes.Remove(patch); + } + catch (HarmonyException exception) + { + Log.Error($"Patching by attributes failed!\n{exception}"); + + failedPatch++; + continue; + } + } + + ListPool.Pool.Return(toPatch); + + Log.Debug("Events patched by attributes successfully!"); +#if DEBUG + Harmony.DEBUG = lastDebugStatus; +#endif + } + catch (Exception exception) + { + Log.Error($"Patching by attributes failed!\n{exception}"); + } + } + + /// + /// Checks the list and un-patches any methods that have been defined there. Once un-patching has been done, they can be patched by plugins, but will not be re-patchable by Exiled until a server reboot. + /// + public void ReloadDisabledPatches() + { + foreach (MethodBase method in DisabledPatchesHashSet) + { + Harmony.Unpatch(method, HarmonyPatchType.All, Harmony.Id); + + Log.Info($"Unpatched {method.Name}"); + } + } + + /// + /// Unpatches all events. + /// + public void UnpatchAll() + { + Log.Debug("Unpatching events..."); + Harmony.UnpatchAll(Harmony.Id); + UnpatchedTypes = GetAllPatchTypes(); + + Log.Debug("All events have been unpatched. Goodbye!"); + } + + /// + /// Gets all types that have a attributed to them. + /// + /// A of all patch types. + internal static HashSet GetAllPatchTypes() => Assembly.GetExecutingAssembly().GetTypes().Where((type) => type.CustomAttributes.Any((customAtt) => customAtt.AttributeType == typeof(HarmonyPatch))).ToHashSet(); + } +} diff --git a/Exiled.Events/Handlers/Cassie.cs b/Exiled.Events/Handlers/Cassie.cs index fd6f40c51c..aa2748e851 100644 --- a/Exiled.Events/Handlers/Cassie.cs +++ b/Exiled.Events/Handlers/Cassie.cs @@ -8,20 +8,19 @@ namespace Exiled.Events.Handlers { using Exiled.Events.EventArgs.Cassie; - - using Extensions; - - using static Events; + using Exiled.Events.Features; /// /// Cassie related events. /// public static class Cassie { +#pragma warning disable SA1623 // Property summary documentation should match accessors + /// - /// Invoked before sending a cassie message. + /// Invoked before sending a cassie message. /// - public static event CustomEventHandler SendingCassieMessage; + public static Event SendingCassieMessage { get; set; } = new(); /// /// Called before sending a cassie message. diff --git a/Exiled.Events/Handlers/Internal/ExplodingGrenade.cs b/Exiled.Events/Handlers/Internal/ExplodingGrenade.cs new file mode 100644 index 0000000000..f76348e7b3 --- /dev/null +++ b/Exiled.Events/Handlers/Internal/ExplodingGrenade.cs @@ -0,0 +1,25 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Handlers.Internal +{ + using Exiled.API.Features.Pickups; + using Exiled.Events.EventArgs.Map; + + /// + /// Handles event. + /// + internal static class ExplodingGrenade + { + /// + public static void OnChangedIntoGrenade(ChangedIntoGrenadeEventArgs ev) + { + if (ev.Pickup is GrenadePickup grenadePickup) + grenadePickup.GetPickupInfo(ev.Projectile); + } + } +} diff --git a/Exiled.Events/Handlers/Internal/MapGenerated.cs b/Exiled.Events/Handlers/Internal/MapGenerated.cs index caf8f69fe4..55a7c88558 100644 --- a/Exiled.Events/Handlers/Internal/MapGenerated.cs +++ b/Exiled.Events/Handlers/Internal/MapGenerated.cs @@ -18,24 +18,16 @@ namespace Exiled.Events.Handlers.Internal using Exiled.API.Enums; using Exiled.API.Extensions; - - using Interactables.Interobjects; + using Exiled.API.Features.Pickups; using InventorySystem.Items.Firearms.Attachments; using InventorySystem.Items.Firearms.Attachments.Components; - using MapGeneration; - using MapGeneration.Distributors; - using MEC; - using PlayerRoles.PlayableScps.Scp079.Cameras; - using Utils.NonAllocLINQ; - using Broadcast = Broadcast; using Camera = API.Features.Camera; - using Object = UnityEngine.Object; /// /// Handles event. @@ -57,65 +49,18 @@ internal static class MapGenerated public static void OnMapGenerated() { Map.ClearCache(); + + GenerateAttachments(); Timing.CallDelayed(1, GenerateCache); } private static void GenerateCache() { - Warhead.OutsitePanel = Object.FindObjectOfType(); - - GenerateCamera(); - GenerateRooms(); - GenerateWindows(); - GenerateLifts(); - GeneratePocketTeleports(); - GenerateAttachments(); - GenerateLockers(); - - Map.AmbientSoundPlayer = ReferenceHub.HostHub.GetComponent(); - Handlers.Map.OnGenerated(); Timing.CallDelayed(0.1f, Handlers.Server.OnWaitingForPlayers); } - private static void GenerateRooms() - { - // Get bulk of rooms with sorted. - List roomIdentifiers = ListPool.Pool.Get(RoomIdentifier.AllRoomIdentifiers); - - // If no rooms were found, it means a plugin is trying to access this before the map is created. - if (roomIdentifiers.Count == 0) - throw new InvalidOperationException("Plugin is trying to access Rooms before they are created."); - - foreach (RoomIdentifier roomIdentifier in roomIdentifiers) - Room.RoomIdentifierToRoom.Add(roomIdentifier, Room.CreateComponent(roomIdentifier.gameObject)); - - ListPool.Pool.Return(roomIdentifiers); - } - - private static void GenerateWindows() - { - foreach (BreakableWindow breakableWindow in Object.FindObjectsOfType()) - new Window(breakableWindow); - } - - private static void GenerateLifts() - { - foreach (ElevatorChamber elevatorChamber in Object.FindObjectsOfType()) - new Lift(elevatorChamber); - } - - private static void GenerateCamera() - { - foreach (Scp079Camera camera079 in Object.FindObjectsOfType()) - new Camera(camera079); - } - - private static void GeneratePocketTeleports() => Map.TeleportsValue.AddRange(Object.FindObjectsOfType()); - - private static void GenerateLockers() => Map.LockersValue.AddRange(Object.FindObjectsOfType()); - private static void GenerateAttachments() { foreach (FirearmType firearmType in Enum.GetValues(typeof(FirearmType))) @@ -144,8 +89,8 @@ private static void GenerateAttachments() attachmentsSlots .ForEach(slot => baseCode += attachmentIdentifiers - .Where(attachment => attachment.Slot == slot) - .Aggregate((curMin, nextEntry) => nextEntry.Code < curMin.Code ? nextEntry : curMin)); + .Where(attachment => attachment.Slot == slot) + .Min(slot => slot.Code)); Firearm.BaseCodesValue.Add(firearmType, baseCode); Firearm.AvailableAttachmentsValue.Add(firearmType, attachmentIdentifiers.ToArray()); diff --git a/Exiled.Events/Handlers/Internal/PickupEvent.cs b/Exiled.Events/Handlers/Internal/PickupEvent.cs new file mode 100644 index 0000000000..fd80783b84 --- /dev/null +++ b/Exiled.Events/Handlers/Internal/PickupEvent.cs @@ -0,0 +1,38 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Handlers.Internal +{ + using Exiled.API.Features; + using Exiled.API.Features.Pickups; + using InventorySystem.Items.Pickups; + + /// + /// Handles adding and removing from . + /// + internal static class PickupEvent + { + /// + /// Called after a pickup is spawned. Hooked to . + /// + /// The spawned Pickup. + public static void OnSpawnedPickup(ItemPickupBase itemPickupBase) + { + Handlers.Map.OnPickupAdded(new(itemPickupBase)); + } + + /// + /// Called before a pickup is destroyed. Hooked to . + /// + /// The destroyed Pickup. + public static void OnRemovedPickup(ItemPickupBase itemPickupBase) + { + Handlers.Map.OnPickupDestroyed(new(itemPickupBase)); + Pickup.BaseToPickup.Remove(itemPickupBase); + } + } +} diff --git a/Exiled.Events/Handlers/Internal/Round.cs b/Exiled.Events/Handlers/Internal/Round.cs index 1f92c84f25..29ca9dd6f4 100644 --- a/Exiled.Events/Handlers/Internal/Round.cs +++ b/Exiled.Events/Handlers/Internal/Round.cs @@ -40,14 +40,18 @@ public static void OnWaitingForPlayers() /// public static void OnRestartingRound() { + Scp049Role.TurnedPlayers.Clear(); Scp173Role.TurnedPlayers.Clear(); Scp096Role.TurnedPlayers.Clear(); + Scp079Role.TurnedPlayers.Clear(); MultiAdminFeatures.CallEvent(MultiAdminFeatures.EventType.ROUND_END); TeslaGate.IgnoredPlayers.Clear(); TeslaGate.IgnoredRoles.Clear(); TeslaGate.IgnoredTeams.Clear(); + + API.Features.Round.IgnoredPlayers.Clear(); } /// @@ -66,4 +70,4 @@ public static void OnVerified(VerifiedEventArgs ev) RoleAssigner.CheckLateJoin(ev.Player.ReferenceHub, ClientInstanceMode.ReadyClient); } } -} \ No newline at end of file +} diff --git a/Exiled.Events/Handlers/Internal/SceneUnloaded.cs b/Exiled.Events/Handlers/Internal/SceneUnloaded.cs index 5726fe92ac..4626311b13 100644 --- a/Exiled.Events/Handlers/Internal/SceneUnloaded.cs +++ b/Exiled.Events/Handlers/Internal/SceneUnloaded.cs @@ -33,7 +33,6 @@ internal static class SceneUnloaded /// public static void OnSceneUnloaded(Scene _) { - Player.IdsCache.Clear(); Player.UserIdsCache.Clear(); Player.Dictionary.Clear(); Map.ToysValue.Clear(); diff --git a/Exiled.Events/Handlers/Item.cs b/Exiled.Events/Handlers/Item.cs index abfb964982..7ce1feee18 100644 --- a/Exiled.Events/Handlers/Item.cs +++ b/Exiled.Events/Handlers/Item.cs @@ -7,11 +7,11 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Item; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using Extensions; + using Exiled.Events.EventArgs.Item; - using static Events; + using Exiled.Events.Features; /// /// Item related events. @@ -21,32 +21,32 @@ public static class Item /// /// Invoked before the ammo of an firearm are changed. /// - public static event CustomEventHandler ChangingAmmo; + public static Event ChangingAmmo { get; set; } = new (); /// /// Invoked before item attachments are changed. /// - public static event CustomEventHandler ChangingAttachments; + public static Event ChangingAttachments { get; set; } = new(); /// /// Invoked before receiving a preference. /// - public static event CustomEventHandler ReceivingPreference; + public static Event ReceivingPreference { get; set; } = new(); /// /// Invoked before a keycard interacts with a door. /// - public static event CustomEventHandler KeycardInteracting; + public static Event KeycardInteracting { get; set; } = new(); /// /// Invoked before a melee item is swung. /// - public static event CustomEventHandler Swinging; + public static Event Swinging { get; set; } = new(); /// /// Invoked before a is charged. /// - public static event CustomEventHandler ChargingJailbird; + public static Event ChargingJailbird { get; set; } = new(); /// /// Called before the ammo of an firearm is changed. diff --git a/Exiled.Events/Handlers/Map.cs b/Exiled.Events/Handlers/Map.cs index fc8684cf6a..4182c5eb2a 100644 --- a/Exiled.Events/Handlers/Map.cs +++ b/Exiled.Events/Handlers/Map.cs @@ -7,15 +7,14 @@ namespace Exiled.Events.Handlers { +#pragma warning disable SA1623 // Property summary documentation should match accessors + using Exiled.API.Features.Pickups; using Exiled.Events.EventArgs.Map; - - using Extensions; + using Exiled.Events.Features; using MapGeneration.Distributors; - using static Events; - /// /// Map related events. /// @@ -24,78 +23,93 @@ public static class Map /// /// Invoked before placing decals. /// - public static event CustomEventHandler PlacingBulletHole; + public static Event PlacingBulletHole { get; set; } = new(); /// /// Invoked before placing bloods. /// - public static event CustomEventHandler PlacingBlood; + public static Event PlacingBlood { get; set; } = new(); /// /// Invoked before announcing the light containment zone decontamination. /// - public static event CustomEventHandler AnnouncingDecontamination; + public static Event AnnouncingDecontamination { get; set; } = new(); /// /// Invoked before announcing an SCP termination. /// - public static event CustomEventHandler AnnouncingScpTermination; + public static Event AnnouncingScpTermination { get; set; } = new(); /// /// Invoked before announcing the NTF entrance. /// - public static event CustomEventHandler AnnouncingNtfEntrance; + public static Event AnnouncingNtfEntrance { get; set; } = new(); /// - /// Invoked after a has been activated. + /// Invoked before a has been activated. /// - public static event CustomEventHandler GeneratorActivated; + public static Event GeneratorActivating { get; set; } = new(); /// /// Invoked before decontaminating the light containment zone. /// - public static event CustomEventHandler Decontaminating; + public static Event Decontaminating { get; set; } = new(); /// /// Invoked before a grenade explodes. /// - public static event CustomEventHandler ExplodingGrenade; + public static Event ExplodingGrenade { get; set; } = new(); /// /// Invoked before an item is spawned. /// - public static event CustomEventHandler SpawningItem; + public static Event SpawningItem { get; set; } = new(); + + /// + /// Invoked before an item is spawned in locker. + /// + public static Event FillingLocker { get; set; } = new(); /// /// Invoked after the map is generated. /// - public static event CustomEventHandler Generated; + public static Event Generated { get; set; } = new(); /// /// Invoked before the server changes a pickup into a grenade, when triggered by an explosion. /// - public static event CustomEventHandler ChangingIntoGrenade; + public static Event ChangingIntoGrenade { get; set; } = new(); /// /// Invoked after the server changes a pickup into a grenade, when triggered by an explosion. /// - public static event CustomEventHandler ChangedIntoGrenade; + public static Event ChangedIntoGrenade { get; set; } = new(); /// /// Invoked before turning off lights. /// - public static event CustomEventHandler TurningOffLights; + public static Event TurningOffLights { get; set; } = new(); + + /// + /// Invoked after an pickup is spawned. + /// + public static Event PickupAdded { get; set; } = new(); + + /// + /// Invoked after an pickup is destroyed. + /// + public static Event PickupDestroyed { get; set; } = new(); /// /// Called before placing a decal. /// - /// The instance. - public static void OnPlacingBulletHole(PlacingBulletHole ev) => PlacingBulletHole.InvokeSafely(ev); + /// The instance. + public static void OnPlacingBulletHole(PlacingBulletHoleEventArgs ev) => PlacingBulletHole.InvokeSafely(ev); /// /// Called before placing bloods. /// - /// The instance. + /// The instance. public static void OnPlacingBlood(PlacingBloodEventArgs ev) => PlacingBlood.InvokeSafely(ev); /// @@ -117,10 +131,10 @@ public static class Map public static void OnAnnouncingNtfEntrance(AnnouncingNtfEntranceEventArgs ev) => AnnouncingNtfEntrance.InvokeSafely(ev); /// - /// Called after a has been activated. + /// Called before a has been activated. /// - /// The instance. - public static void OnGeneratorActivated(GeneratorActivatedEventArgs ev) => GeneratorActivated.InvokeSafely(ev); + /// The instance. + public static void OnGeneratorActivating(GeneratorActivatingEventArgs ev) => GeneratorActivating.InvokeSafely(ev); /// /// Called before decontaminating the light containment zone. @@ -140,6 +154,12 @@ public static class Map /// The instance. public static void OnSpawningItem(SpawningItemEventArgs ev) => SpawningItem.InvokeSafely(ev); + /// + /// Called before an item is spawned in locker. + /// + /// The instance. + public static void OnFillingLocker(FillingLockerEventArgs ev) => FillingLocker.InvokeSafely(ev); + /// /// Called after the map is generated. /// @@ -162,5 +182,17 @@ public static class Map /// /// The instance. public static void OnTurningOffLights(TurningOffLightsEventArgs ev) => TurningOffLights.InvokeSafely(ev); + + /// + /// Called after an pickup is spawned. + /// + /// The instance. + public static void OnPickupAdded(PickupAddedEventArgs ev) => PickupAdded.InvokeSafely(ev); + + /// + /// Called after an pickup is destroyed. + /// + /// The instance. + public static void OnPickupDestroyed(PickupDestroyedEventArgs ev) => PickupDestroyed.InvokeSafely(ev); } } \ No newline at end of file diff --git a/Exiled.Events/Handlers/Player.cs b/Exiled.Events/Handlers/Player.cs index c9bf010505..68bf67d78a 100644 --- a/Exiled.Events/Handlers/Player.cs +++ b/Exiled.Events/Handlers/Player.cs @@ -7,457 +7,469 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Player; +#pragma warning disable IDE0079 +#pragma warning disable IDE0060 +#pragma warning disable SA1623 // Property summary documentation should match accessors + + using System; - using Extensions; + using Exiled.Events.EventArgs.Player; - using PlayerRoles; - using PlayerRoles.FirstPersonControl.Thirdperson; + using Exiled.Events.Features; using PluginAPI.Core.Attributes; using PluginAPI.Enums; using PluginAPI.Events; - using static Events; - -#pragma warning disable IDE0079 -#pragma warning disable IDE0060 - /// /// Player related events. /// public class Player -#pragma warning restore IDE0079 // Retirer la suppression inutile { /// /// Invoked before authenticating a . /// - public static event CustomEventHandler PreAuthenticating; + public static Event PreAuthenticating { get; set; } = new(); /// /// Invoked before reserved slot is finalized for a . /// - public static event CustomEventHandler ReservedSlot; + public static Event ReservedSlot { get; set; } = new(); /// /// Invoked before kicking a from the server. /// - public static event CustomEventHandler Kicking; + public static Event Kicking { get; set; } = new(); /// /// Invoked after a has been kicked from the server. /// - public static event CustomEventHandler Kicked; + public static Event Kicked { get; set; } = new(); /// /// Invoked before banning a from the server. /// - public static event CustomEventHandler Banning; + public static Event Banning { get; set; } = new(); /// /// Invoked after a has been banned from the server. /// - public static event CustomEventHandler Banned; + public static Event Banned { get; set; } = new(); + + /// + /// Invoked before using an . + /// + public static Event UsingItem { get; set; } = new(); + + /// + /// Invoked after a uses an . + /// + public static Event UsingItemCompleted { get; set; } = new (); /// - /// Invoked after a uses an . + /// Invoked after a uses an . /// /// /// Invoked after , if a player's class has /// changed during their health increase, won't fire. /// - public static event CustomEventHandler UsedItem; + public static Event UsedItem { get; set; } = new(); + + /// + /// Invoked before a has stopped the use of a . + /// + public static Event CancellingItemUse { get; set; } = new(); /// /// Invoked after a has stopped the use of a . /// - public static event CustomEventHandler CancellingItemUse; + public static Event CancelledItemUse { get; set; } = new(); /// /// Invoked after a interacted with something. /// - public static event CustomEventHandler Interacted; + public static Event Interacted { get; set; } = new(); /// /// Invoked before spawning a . /// - public static event CustomEventHandler SpawningRagdoll; + public static Event SpawningRagdoll { get; set; } = new(); /// /// Invoked before activating the warhead panel. /// - public static event CustomEventHandler ActivatingWarheadPanel; + public static Event ActivatingWarheadPanel { get; set; } = new(); /// /// Invoked before activating a workstation. /// - public static event CustomEventHandler ActivatingWorkstation; + public static Event ActivatingWorkstation { get; set; } = new(); /// /// Invoked before deactivating a workstation. /// - public static event CustomEventHandler DeactivatingWorkstation; - - /// - /// Invoked before using an . - /// - public static event CustomEventHandler UsingItem; + public static Event DeactivatingWorkstation { get; set; } = new(); /// /// Invoked after a has joined the server. /// - public static event CustomEventHandler Joined; + public static Event Joined { get; set; } = new(); /// - /// Ivoked after a has been verified. + /// Invoked after a has been verified. /// - public static event CustomEventHandler Verified; + public static Event Verified { get; set; } = new(); /// /// Invoked after a has left the server. /// - public static event CustomEventHandler Left; + public static Event Left { get; set; } = new(); /// /// Invoked before destroying a . /// - public static event CustomEventHandler Destroying; + public static Event Destroying { get; set; } = new(); /// /// Invoked before hurting a . /// - public static event CustomEventHandler Hurting; + public static Event Hurting { get; set; } = new(); /// /// Invoked before a dies. /// - public static event CustomEventHandler Dying; + public static Event Dying { get; set; } = new(); /// /// Invoked after a died. /// - public static event CustomEventHandler Died; + public static Event Died { get; set; } = new(); /// /// Invoked before changing a role. /// /// If is set to when Escape is , tickets will still be given to the escapee's team even though they will 'fail' to escape. Use to block escapes instead. - public static event CustomEventHandler ChangingRole; + public static Event ChangingRole { get; set; } = new(); /// /// Invoked afer throwing an . /// - public static event CustomEventHandler ThrownProjectile; + public static Event ThrownProjectile { get; set; } = new(); /// /// Invoked before receving a throwing request an . /// - public static event CustomEventHandler ThrowingRequest; + public static Event ThrowingRequest { get; set; } = new(); /// /// Invoked before dropping an . /// - public static event CustomEventHandler DroppingItem; + public static Event DroppingItem { get; set; } = new(); /// /// Invoked before dropping a null . /// - public static event CustomEventHandler DroppingNothing; + public static Event DroppingNothing { get; set; } = new(); /// /// Invoked before picking up an . /// - public static event CustomEventHandler PickingUpItem; + public static Event PickingUpItem { get; set; } = new(); /// /// Invoked before handcuffing a . /// - public static event CustomEventHandler Handcuffing; + public static Event Handcuffing { get; set; } = new(); /// /// Invoked before freeing a handcuffed . /// - public static event CustomEventHandler RemovingHandcuffs; + public static Event RemovingHandcuffs { get; set; } = new(); /// /// Invoked before a escapes. /// - public static event CustomEventHandler Escaping; + public static Event Escaping { get; set; } = new(); /// /// Invoked before a begins speaking to the intercom. /// - public static event CustomEventHandler IntercomSpeaking; + public static Event IntercomSpeaking { get; set; } = new(); /// /// Invoked after a gets shot. /// - public static event CustomEventHandler Shot; + public static Event Shot { get; set; } = new(); /// /// Invoked before a shoots a weapon. /// - public static event CustomEventHandler Shooting; + public static Event Shooting { get; set; } = new(); /// /// Invoked before a enters the pocket dimension. /// - public static event CustomEventHandler EnteringPocketDimension; + public static Event EnteringPocketDimension { get; set; } = new(); /// /// Invoked before a escapes the pocket dimension. /// - public static event CustomEventHandler EscapingPocketDimension; + public static Event EscapingPocketDimension { get; set; } = new(); /// /// Invoked before a fails to escape the pocket dimension. /// - public static event CustomEventHandler FailingEscapePocketDimension; + public static Event FailingEscapePocketDimension { get; set; } = new(); /// /// Invoked before a enters killer collision. /// - public static event CustomEventHandler EnteringKillerCollision; + public static Event EnteringKillerCollision { get; set; } = new(); /// /// Invoked before a reloads a weapon. /// - public static event CustomEventHandler ReloadingWeapon; + public static Event ReloadingWeapon { get; set; } = new(); /// /// Invoked before spawning a . /// - public static event CustomEventHandler Spawning; + public static Event Spawning { get; set; } = new(); /// /// Invoked after a has spawned. /// - public static event CustomEventHandler Spawned; + public static Event Spawned { get; set; } = new(); /// /// Invoked after a held changes. /// - public static event CustomEventHandler ChangedItem; + public static Event ChangedItem { get; set; } = new(); /// /// Invoked before a held changes. /// - public static event CustomEventHandler ChangingItem; + public static Event ChangingItem { get; set; } = new(); /// /// Invoked before changing a group. /// - public static event CustomEventHandler ChangingGroup; + public static Event ChangingGroup { get; set; } = new(); /// /// Invoked before a interacts with a door. /// - public static event CustomEventHandler InteractingDoor; + public static Event InteractingDoor { get; set; } = new(); /// /// Invoked before a interacts with an elevator. /// - public static event CustomEventHandler InteractingElevator; + public static Event InteractingElevator { get; set; } = new(); /// /// Invoked before a interacts with a locker. /// - public static event CustomEventHandler InteractingLocker; + public static Event InteractingLocker { get; set; } = new(); /// /// Invoked before a triggers a tesla gate. /// - public static event CustomEventHandler TriggeringTesla; + public static Event TriggeringTesla { get; set; } = new(); /// /// Invoked before a unlocks a generator. /// - public static event CustomEventHandler UnlockingGenerator; + public static Event UnlockingGenerator { get; set; } = new(); /// /// Invoked before a opens a generator. /// - public static event CustomEventHandler OpeningGenerator; + public static Event OpeningGenerator { get; set; } = new(); /// /// Invoked before a closes a generator. /// - public static event CustomEventHandler ClosingGenerator; + public static Event ClosingGenerator { get; set; } = new(); /// /// Invoked before a turns on the generator by switching lever. /// - public static event CustomEventHandler ActivatingGenerator; + public static Event ActivatingGenerator { get; set; } = new(); /// /// Invoked before a turns off the generator by switching lever. /// - public static event CustomEventHandler StoppingGenerator; + public static Event StoppingGenerator { get; set; } = new(); /// /// Invoked before a receives a status effect. /// - public static event CustomEventHandler ReceivingEffect; + public static Event ReceivingEffect { get; set; } = new(); /// /// Invoked before muting a user. /// - public static event CustomEventHandler IssuingMute; + public static Event IssuingMute { get; set; } = new(); /// /// Invoked before unmuting a user. /// - public static event CustomEventHandler RevokingMute; + public static Event RevokingMute { get; set; } = new(); /// /// Invoked before a user's radio battery charge is changed. /// - public static event CustomEventHandler UsingRadioBattery; + public static Event UsingRadioBattery { get; set; } = new(); /// /// Invoked before a user's radio preset is changed. /// - public static event CustomEventHandler ChangingRadioPreset; + public static Event ChangingRadioPreset { get; set; } = new(); /// /// Invoked before a MicroHID state is changed. /// - public static event CustomEventHandler ChangingMicroHIDState; + public static Event ChangingMicroHIDState { get; set; } = new(); /// /// Invoked before a MicroHID energy is changed. /// - public static event CustomEventHandler UsingMicroHIDEnergy; - - /// - /// Called before processing a hotkey. - /// - public static event CustomEventHandler ProcessingHotkey; + public static Event UsingMicroHIDEnergy { get; set; } = new(); /// /// Invoked before dropping ammo. /// - public static event CustomEventHandler DroppingAmmo; + public static Event DroppingAmmo { get; set; } = new(); /// /// Invoked before a interacts with a shooting target. /// - public static event CustomEventHandler InteractingShootingTarget; + public static Event InteractingShootingTarget { get; set; } = new(); /// /// Invoked before a damages a shooting target. /// - public static event CustomEventHandler DamagingShootingTarget; + public static Event DamagingShootingTarget { get; set; } = new(); /// /// Invoked before a flips a coin. /// - public static event CustomEventHandler FlippingCoin; + public static Event FlippingCoin { get; set; } = new(); /// /// Invoked before a toggles the flashlight. /// - public static event CustomEventHandler TogglingFlashlight; + public static Event TogglingFlashlight { get; set; } = new(); /// /// Invoked before a unloads a weapon. /// - public static event CustomEventHandler UnloadingWeapon; + public static Event UnloadingWeapon { get; set; } = new(); /// /// Invoked before a triggers an aim action. /// - public static event CustomEventHandler AimingDownSight; + public static Event AimingDownSight { get; set; } = new(); /// /// Invoked before a toggles the weapon's flashlight. /// - public static event CustomEventHandler TogglingWeaponFlashlight; + public static Event TogglingWeaponFlashlight { get; set; } = new(); /// /// Invoked before a dryfires a weapon. /// - public static event CustomEventHandler DryfiringWeapon; + public static Event DryfiringWeapon { get; set; } = new(); /// /// Invoked after a presses the voicechat key. /// - public static event CustomEventHandler VoiceChatting; + public static Event VoiceChatting { get; set; } = new(); /// /// Invoked before a makes noise. /// - public static event CustomEventHandler MakingNoise; + public static Event MakingNoise { get; set; } = new(); /// /// Invoked before a jumps. /// - public static event CustomEventHandler Jumping; + public static Event Jumping { get; set; } = new(); /// /// Invoked after a lands. /// - public static event CustomEventHandler Landing; + public static Event Landing { get; set; } = new(); /// /// Invoked after a presses the transmission key. /// - public static event CustomEventHandler Transmitting; + public static Event Transmitting { get; set; } = new(); /// /// Invoked before a changes move state. /// - public static event CustomEventHandler ChangingMoveState; + public static Event ChangingMoveState { get; set; } = new(); /// /// Invoked after a changed spectated player. /// - public static event CustomEventHandler ChangingSpectatedPlayer; + public static Event ChangingSpectatedPlayer { get; set; } = new(); /// /// Invoked before a toggles the NoClip mode. /// - public static event CustomEventHandler TogglingNoClip; + public static Event TogglingNoClip { get; set; } = new(); /// /// Invoked before a toggles overwatch. /// - public static event CustomEventHandler TogglingOverwatch; + public static Event TogglingOverwatch { get; set; } = new(); /// /// Invoked before a searches a Pickup. /// - public static event CustomEventHandler SearchingPickup; + public static Event SearchingPickup { get; set; } = new(); /// /// Invoked before a damage a Window. + /// // TODO: DamagingWindow instead of PlayerDamageWindow + public static Event PlayerDamageWindow { get; set; } = new(); + + /// + /// Invoked before a damage a Door. /// - public static event CustomEventHandler PlayerDamageWindow; + public static Event DamagingDoor { get; set; } = new(); /// /// Invoked after a has an item added to their inventory. /// - public static event CustomEventHandler ItemAdded; + public static Event ItemAdded { get; set; } = new(); /// /// Invoked before KillPlayer is called. /// - public static event CustomEventHandler KillingPlayer; + public static Event KillingPlayer { get; set; } = new(); /// /// Invoked before a enters in an environmental hazard. /// - public static event CustomEventHandler EnteringEnvironmentalHazard; + public static Event EnteringEnvironmentalHazard { get; set; } = new(); /// /// Invoked when a stays on an environmental hazard. /// - public static event CustomEventHandler StayingOnEnvironmentalHazard; + public static Event StayingOnEnvironmentalHazard { get; set; } = new(); /// /// Invoked when a exists from an environmental hazard. /// - public static event CustomEventHandler ExitingEnvironmentalHazard; + public static Event ExitingEnvironmentalHazard { get; set; } = new(); + + /// + /// Invoked before a 's nickname is changed. + /// + public static Event ChangingNickname { get; set; } = new(); /// /// Called before reserved slot is resolved for a . @@ -490,17 +502,35 @@ public class Player public static void OnBanned(BannedEventArgs ev) => Banned.InvokeSafely(ev); /// - /// Called after a used a medical item. + /// Called before using a usable item. + /// + /// The instance. + public static void OnUsingItem(UsingItemEventArgs ev) => UsingItem.InvokeSafely(ev); + + /// + /// Called before completed using of a usable item. + /// + /// The instance. + public static void OnUsingItemCompleted(UsingItemCompletedEventArgs ev) => UsingItemCompleted.InvokeSafely(ev); + + /// + /// Called after a used a item. /// /// The instance. public static void OnUsedItem(UsedItemEventArgs ev) => UsedItem.InvokeSafely(ev); /// - /// Called after a has stopped the use of a medical item. + /// Called before a has stopped the use of a item. /// /// The instance. public static void OnCancellingItemUse(CancellingItemUseEventArgs ev) => CancellingItemUse.InvokeSafely(ev); + /// + /// Called after a has stopped the use of a item. + /// + /// The instance. + public static void OnCancelledItemUse(CancelledItemUseEventArgs ev) => CancelledItemUse.InvokeSafely(ev); + /// /// Called after a interacted with something. /// @@ -531,12 +561,6 @@ public class Player /// The instance. public static void OnDeactivatingWorkstation(DeactivatingWorkstationEventArgs ev) => DeactivatingWorkstation.InvokeSafely(ev); - /// - /// Called before using a usable item. - /// - /// The instance. - public static void OnUsingItem(UsingItemEventArgs ev) => UsingItem.InvokeSafely(ev); - /// /// Called after a has left the server. /// @@ -560,6 +584,7 @@ public class Player /// Called before throwing a grenade. /// /// The instance. + // TODO: rename that to OnThrownProjectile public static void OnThrowingProjectile(ThrownProjectileEventArgs ev) => ThrownProjectile.InvokeSafely(ev); /// @@ -724,12 +749,6 @@ public class Player /// The instance. public static void OnUsingMicroHIDEnergy(UsingMicroHIDEnergyEventArgs ev) => UsingMicroHIDEnergy.InvokeSafely(ev); - /// - /// Called before processing a hotkey. - /// - /// The instance. - public static void OnProcessingHotkey(ProcessingHotkeyEventArgs ev) => ProcessingHotkey.InvokeSafely(ev); - /// /// Called before a interacts with a shooting target. /// @@ -787,10 +806,8 @@ public class Player /// /// Called before a makes noise. /// - /// The instance. - /// The footsteps distance. - public static void OnMakingNoise(AnimatedCharacterModel animatedCharacterModel, float distance) - => MakingNoise.InvokeSafely(new MakingNoiseEventArgs(animatedCharacterModel, distance)); + /// The instance. + public static void OnMakingNoise(MakingNoiseEventArgs ev) => MakingNoise.InvokeSafely(ev); /// /// Called before a jumps. @@ -879,6 +896,12 @@ public static void OnItemAdded(ReferenceHub referenceHub, InventorySystem.Items. /// The instance. public static void OnPlayerDamageWindow(DamagingWindowEventArgs ev) => PlayerDamageWindow.InvokeSafely(ev); + /// + /// Called before a damage a window. + /// + /// The instance. + public static void OnDamagingDoor(DamagingDoorEventArgs ev) => DamagingDoor.InvokeSafely(ev); + /// /// Called before a unlocks a generator. /// @@ -969,6 +992,12 @@ public static void OnItemAdded(ReferenceHub referenceHub, InventorySystem.Items. /// The instance. public static void OnDestroying(DestroyingEventArgs ev) => Destroying.InvokeSafely(ev); + /// + /// Called before a 's custom display name is changed. + /// + /// The instance. + public static void OnChangingNickname(ChangingNicknameEventArgs ev) => ChangingNickname.InvokeSafely(ev); + /// /// Called before pre-authenticating a . /// diff --git a/Exiled.Events/Handlers/Scp049.cs b/Exiled.Events/Handlers/Scp049.cs index 75a0b3c456..e504a8cae8 100644 --- a/Exiled.Events/Handlers/Scp049.cs +++ b/Exiled.Events/Handlers/Scp049.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp049; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp049; + using Exiled.Events.Features; /// /// SCP-049 related events. @@ -21,27 +20,27 @@ public static class Scp049 /// /// Invoked before SCP-049 finishes recalling a player. /// - public static event CustomEventHandler FinishingRecall; + public static Event FinishingRecall { get; set; } = new(); /// /// Invoked before SCP-049 begins recalling a player. /// - public static event CustomEventHandler StartingRecall; + public static Event StartingRecall { get; set; } = new(); /// - /// Invoked before SCP-049-2 consumes a corpse. + /// Invoked before SCP-049 uses the sense ability. /// - public static event CustomEventHandler ConsumingCorpse; + public static Event ActivatingSense { get; set; } = new(); /// - /// Invoked before SCP-049 uses the sense ability. + /// Invoked before SCP-049 uses the call ability. /// - public static event CustomEventHandler ActivatingSense; + public static Event SendingCall { get; set; } = new(); /// - /// Invoked before SCP-049 uses the call ability. + /// Invoked before SCP-049 attacks player. /// - public static event CustomEventHandler SendingCall; + public static Event Attacking { get; set; } = new(); /// /// Called before SCP-049 finishes recalling a player. @@ -55,12 +54,6 @@ public static class Scp049 /// The instance. public static void OnStartingRecall(StartingRecallEventArgs ev) => StartingRecall.InvokeSafely(ev); - /// - /// Called before SCP-049-2 consumes a corpse. - /// - /// The instance. - public static void OnConsumingCorpse(ConsumingCorpseEventArgs ev) => ConsumingCorpse.InvokeSafely(ev); - /// /// Called before SCP-049 starts the sense ability. /// @@ -72,5 +65,11 @@ public static class Scp049 /// /// The instance. public static void OnSendingCall(SendingCallEventArgs ev) => SendingCall.InvokeSafely(ev); + + /// + /// Called before SCP-049 attacks player. + /// + /// The instance. + public static void OnAttacking(AttackingEventArgs ev) => Attacking.InvokeSafely(ev); } } \ No newline at end of file diff --git a/Exiled.Events/Handlers/Scp0492.cs b/Exiled.Events/Handlers/Scp0492.cs new file mode 100644 index 0000000000..0509a9cab2 --- /dev/null +++ b/Exiled.Events/Handlers/Scp0492.cs @@ -0,0 +1,42 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Handlers +{ +#pragma warning disable SA1623 // Property summary documentation should match accessors + + using Exiled.Events.EventArgs.Scp0492; + using Exiled.Events.Features; + + /// + /// related events. + /// + public class Scp0492 + { + /// + /// Invoked before a player triggers the bloodlust effect for 049-2. + /// + public static Event TriggeringBloodlust { get; set; } = new (); + + /// + /// Called before 049-2 gets his benefits from consuming ability. + /// + public static Event ConsumingCorpse { get; set; } = new(); + + /// + /// Called before a player triggers the bloodlust effect for 049-2. + /// + /// The instance. + public static void OnTriggeringBloodlust(TriggeringBloodlustEventArgs ev) => TriggeringBloodlust.InvokeSafely(ev); + + /// + /// Invokes before 049-2 gets his benefits from consuming ability. + /// + /// instance. + public static void OnConsumingCorpse(ConsumingCorpseEventArgs ev) => ConsumingCorpse.InvokeSafely(ev); + } +} diff --git a/Exiled.Events/Handlers/Scp079.cs b/Exiled.Events/Handlers/Scp079.cs index 8c498b96c9..41cc1fd49c 100644 --- a/Exiled.Events/Handlers/Scp079.cs +++ b/Exiled.Events/Handlers/Scp079.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp079; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp079; + using Exiled.Events.Features; /// /// SCP-079 related events. @@ -21,62 +20,62 @@ public static class Scp079 /// /// Invoked before SCP-079 switches cameras. /// - public static event CustomEventHandler ChangingCamera; + public static Event ChangingCamera { get; set; } = new(); /// /// Invoked before gaining experience with SCP-079. /// - public static event CustomEventHandler GainingExperience; + public static Event GainingExperience { get; set; } = new(); /// /// Invoked before gaining levels with SCP-079. /// - public static event CustomEventHandler GainingLevel; + public static Event GainingLevel { get; set; } = new(); /// /// Invoked before triggering a tesla with SCP-079. /// - public static event CustomEventHandler InteractingTesla; + public static Event InteractingTesla { get; set; } = new(); /// /// Invoked before triggering a door with SCP-079. /// - public static event CustomEventHandler TriggeringDoor; + public static Event TriggeringDoor { get; set; } = new(); /// /// Invoked before SCP-079 teleports using an elevator. /// - public static event CustomEventHandler ElevatorTeleporting; + public static Event ElevatorTeleporting { get; set; } = new(); /// /// Invoked before SCP-079 lockdowns a room. /// - public static event CustomEventHandler LockingDown; + public static Event LockingDown { get; set; } = new(); /// /// Invoked before SCP-079 changes a speaker status. /// - public static event CustomEventHandler ChangingSpeakerStatus; + public static Event ChangingSpeakerStatus { get; set; } = new(); /// /// Invoked after SCP-079 recontainment. /// - public static event CustomEventHandler Recontained; + public static Event Recontained { get; set; } = new(); /// /// Invoked before SCP-079 sends a ping. /// - public static event CustomEventHandler Pinging; + public static Event Pinging { get; set; } = new(); /// /// Invoked before SCP-079 turns off the lights in a room. /// - public static event CustomEventHandler RoomBlackout; + public static Event RoomBlackout { get; set; } = new(); /// /// Invoked before SCP-079 turns off the lights in a zone. /// - public static event CustomEventHandler ZoneBlackout; + public static Event ZoneBlackout { get; set; } = new(); /// /// Called before SCP-079 switches cameras. diff --git a/Exiled.Events/Handlers/Scp096.cs b/Exiled.Events/Handlers/Scp096.cs index f64f16ad4d..45cae82eb4 100644 --- a/Exiled.Events/Handlers/Scp096.cs +++ b/Exiled.Events/Handlers/Scp096.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp096; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp096; + using Exiled.Events.Features; /// /// SCP-096 related events. @@ -21,32 +20,32 @@ public static class Scp096 /// /// Invoked before SCP-096 is enraged. /// - public static event CustomEventHandler Enraging; + public static Event Enraging { get; set; } = new(); /// /// Invoked before SCP-096 calms down. /// - public static event CustomEventHandler CalmingDown; + public static Event CalmingDown { get; set; } = new(); /// /// Invoked before adding a target to SCP-096. /// - public static event CustomEventHandler AddingTarget; + public static Event AddingTarget { get; set; } = new(); /// /// Invoked before SCP-096 begins prying open a gate. /// - public static event CustomEventHandler StartPryingGate; + public static Event StartPryingGate { get; set; } = new(); /// /// Invoked before SCP-096 begins charging. /// - public static event CustomEventHandler Charging; + public static Event Charging { get; set; } = new(); /// /// Invoked before SCP-096 tries not to cry. /// - public static event CustomEventHandler TryingNotToCry; + public static Event TryingNotToCry { get; set; } = new(); /// /// Called before SCP-096 is enraged. diff --git a/Exiled.Events/Handlers/Scp106.cs b/Exiled.Events/Handlers/Scp106.cs index 38317b8e94..54bf778fbf 100644 --- a/Exiled.Events/Handlers/Scp106.cs +++ b/Exiled.Events/Handlers/Scp106.cs @@ -7,26 +7,36 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp106; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp106; + using Exiled.Events.Features; /// /// SCP-106 related events. /// public static class Scp106 { + /// + /// Invoked before SCP-106 attacks player. + /// + public static Event Attacking { get; set; } = new(); + /// /// Invoked before SCP-106 teleports using the hunter atlas. /// - public static event CustomEventHandler Teleporting; + public static Event Teleporting { get; set; } = new(); /// /// Invoked before SCP-106 use the stalk ability. /// - public static event CustomEventHandler Stalking; + public static Event Stalking { get; set; } = new(); + + /// + /// Called before SCP-106 attacks player. + /// + /// The instance. + public static void OnAttacking(AttackingEventArgs ev) => Attacking.InvokeSafely(ev); /// /// Called before SCP-106 teleports using the hunter atlas. diff --git a/Exiled.Events/Handlers/Scp173.cs b/Exiled.Events/Handlers/Scp173.cs index aa60b1e2b9..4f1f98dbec 100644 --- a/Exiled.Events/Handlers/Scp173.cs +++ b/Exiled.Events/Handlers/Scp173.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp173; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp173; + using Exiled.Events.Features; /// /// SCP-173 related events. @@ -21,17 +20,17 @@ public static class Scp173 /// /// Invoked before players near SCP-173 blink. /// - public static event CustomEventHandler Blinking; + public static Event Blinking { get; set; } = new(); /// /// Invoked before a tantrum is placed. /// - public static event CustomEventHandler PlacingTantrum; + public static Event PlacingTantrum { get; set; } = new(); /// /// Invoked before using breakneck speeds. /// - public static event CustomEventHandler UsingBreakneckSpeeds; + public static Event UsingBreakneckSpeeds { get; set; } = new(); /// /// Called before players near SCP-173 blink. diff --git a/Exiled.Events/Handlers/Scp244.cs b/Exiled.Events/Handlers/Scp244.cs index 902319f9e5..1771762986 100644 --- a/Exiled.Events/Handlers/Scp244.cs +++ b/Exiled.Events/Handlers/Scp244.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp244; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp244; + using Exiled.Events.Features; /// /// Scp244 related events. @@ -21,17 +20,17 @@ public static class Scp244 /// /// Invoked before using an . /// - public static event CustomEventHandler UsingScp244; + public static Event UsingScp244 { get; set; } = new(); /// /// Invoked before an Scp244 take damage. /// - public static event CustomEventHandler DamagingScp244; + public static Event DamagingScp244 { get; set; } = new(); /// /// Invoked before an Scp244 open because the angle was too low. /// - public static event CustomEventHandler OpeningScp244; + public static Event OpeningScp244 { get; set; } = new(); /// /// Called before using a usable item. diff --git a/Exiled.Events/Handlers/Scp330.cs b/Exiled.Events/Handlers/Scp330.cs index 4abbcfde1d..19f0534ae2 100644 --- a/Exiled.Events/Handlers/Scp330.cs +++ b/Exiled.Events/Handlers/Scp330.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp330; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp330; + using Exiled.Events.Features; /// /// Scp330 related events. @@ -21,22 +20,22 @@ public static class Scp330 /// /// Invoked before a interacts with SCP-330. /// - public static event CustomEventHandler InteractingScp330; + public static Event InteractingScp330 { get; set; } = new(); /// /// Invoked before a drop a SCP-330 candy. /// - public static event CustomEventHandler DroppingScp330; + public static Event DroppingScp330 { get; set; } = new(); /// /// Invoked before a player eats a candy from SCP-330. /// - public static event CustomEventHandler EatingScp330; + public static Event EatingScp330 { get; set; } = new(); /// /// Invoked after the player has eaten a candy from SCP-330. /// - public static event CustomEventHandler EatenScp330; + public static Event EatenScp330 { get; set; } = new(); /// /// Called before a player eats a candy from SCP-330. diff --git a/Exiled.Events/Handlers/Scp914.cs b/Exiled.Events/Handlers/Scp914.cs index 4ef7b192cb..3417aa7789 100644 --- a/Exiled.Events/Handlers/Scp914.cs +++ b/Exiled.Events/Handlers/Scp914.cs @@ -7,11 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp914; - - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp914; + using Exiled.Events.Features; /// /// Handles SCP-914 related events. @@ -21,27 +20,27 @@ public static class Scp914 /// /// Invoked before SCP-914 upgrades a Pickup. /// - public static event CustomEventHandler UpgradingPickup; + public static Event UpgradingPickup { get; set; } = new(); /// /// Invoked before SCP-914 upgrades an item in a player's inventory. /// - public static event CustomEventHandler UpgradingInventoryItem; + public static Event UpgradingInventoryItem { get; set; } = new(); /// /// Invoked before SCP-914 upgrades a player. /// - public static event CustomEventHandler UpgradingPlayer; + public static Event UpgradingPlayer { get; set; } = new(); /// /// Invoked before activating the SCP-914 machine. /// - public static event CustomEventHandler Activating; + public static Event Activating { get; set; } = new(); /// /// Invoked before changing the SCP-914 machine knob setting. /// - public static event CustomEventHandler ChangingKnobSetting; + public static Event ChangingKnobSetting { get; set; } = new(); /// /// Called before SCP-914 upgrades a item. diff --git a/Exiled.Events/Handlers/Scp939.cs b/Exiled.Events/Handlers/Scp939.cs index 1736e13a03..bb93cf51b3 100644 --- a/Exiled.Events/Handlers/Scp939.cs +++ b/Exiled.Events/Handlers/Scp939.cs @@ -7,10 +7,10 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Scp939; - using Extensions; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using static Events; + using Exiled.Events.EventArgs.Scp939; + using Exiled.Events.Features; /// /// Handles SCP-939 related events. @@ -20,32 +20,38 @@ public static class Scp939 /// /// Invoked before SCP-939 changes its target focus. /// - public static event CustomEventHandler ChangingFocus; + public static Event ChangingFocus { get; set; } = new(); /// /// Invoked before SCP-939 uses its lunge ability. /// - public static event CustomEventHandler Lunging; + public static Event Lunging { get; set; } = new(); /// /// Invoked before SCP-939 uses its amnestic cloud ability. /// - public static event CustomEventHandler PlacingAmnesticCloud; + public static Event PlacingAmnesticCloud { get; set; } = new(); /// /// Invoked before SCP-939 plays a stolen voice. /// - public static event CustomEventHandler PlayingVoice; + public static Event PlayingVoice { get; set; } = new(); /// /// Invoked before SCP-939 will save Human voice. /// - public static event CustomEventHandler SavingVoice; + public static Event SavingVoice { get; set; } = new(); /// /// Invoked before SCP-939 plays a sound effect. /// - public static event CustomEventHandler PlayingSound; + public static Event PlayingSound { get; set; } = new(); + + /// + /// Invoked after SCP-939 attack. + /// + /// This event is calling only when attack doesn't have target. + public static Event Clawed { get; set; } = new(); /// /// Called before SCP-939 changes its target focus. @@ -82,5 +88,11 @@ public static class Scp939 /// /// The instance. public static void OnPlayingSound(PlayingSoundEventArgs ev) => PlayingSound.InvokeSafely(ev); + + /// + /// Called after SCP-939 attacks. + /// + /// The instance. + public static void OnClawed(ClawedEventArgs ev) => Clawed.InvokeSafely(ev); } } \ No newline at end of file diff --git a/Exiled.Events/Handlers/Server.cs b/Exiled.Events/Handlers/Server.cs index f852851c84..ceddc32ada 100644 --- a/Exiled.Events/Handlers/Server.cs +++ b/Exiled.Events/Handlers/Server.cs @@ -7,12 +7,11 @@ namespace Exiled.Events.Handlers { +#pragma warning disable SA1623 // Property summary documentation should match accessors + using Exiled.Events.EventArgs.Player; using Exiled.Events.EventArgs.Server; - - using Extensions; - - using static Events; + using Exiled.Events.Features; /// /// Server related events. @@ -22,77 +21,82 @@ public static class Server /// /// Invoked before waiting for players. /// - public static event CustomEventHandler WaitingForPlayers; + public static Event WaitingForPlayers { get; set; } = new(); /// /// Invoked after the start of a new round. /// - public static event CustomEventHandler RoundStarted; + public static Event RoundStarted { get; set; } = new(); /// /// Invoked before ending a round. /// - public static event CustomEventHandler EndingRound; + public static Event EndingRound { get; set; } = new(); /// /// Invoked after the end of a round. /// - public static event CustomEventHandler RoundEnded; + public static Event RoundEnded { get; set; } = new(); /// /// Invoked before the restart of a round. /// - public static event CustomEventHandler RestartingRound; + public static Event RestartingRound { get; set; } = new(); /// /// Invoked when a player reports a cheater. /// - public static event CustomEventHandler ReportingCheater; + public static Event ReportingCheater { get; set; } = new(); /// /// Invoked before respawning a wave of Chaos Insurgency or NTF. /// - public static event CustomEventHandler RespawningTeam; + public static Event RespawningTeam { get; set; } = new(); /// /// Invoked before adding an unit name. /// - public static event CustomEventHandler AddingUnitName; + public static Event AddingUnitName { get; set; } = new(); /// /// Invoked when sending a complaint about a player to the local server administrators. /// - public static event CustomEventHandler LocalReporting; + public static Event LocalReporting { get; set; } = new(); + + /// + /// Invoked before choosing the Team than player will get. + /// + public static Event ChoosingStartTeamQueue { get; set; } = new(); /// /// Invoked after the "reload configs" command is ran. /// - public static event CustomEventHandler ReloadedConfigs; + public static Event ReloadedConfigs { get; set; } = new(); /// /// Invoked after the "reload translations" command is ran. /// - public static event CustomEventHandler ReloadedTranslations; + public static Event ReloadedTranslations { get; set; } = new(); /// /// Invoked after the "reload gameplay" command is ran. /// - public static event CustomEventHandler ReloadedGameplay; + public static Event ReloadedGameplay { get; set; } = new(); /// /// Invoked after the "reload remoteadminconfigs" command is ran. /// - public static event CustomEventHandler ReloadedRA; + public static Event ReloadedRA { get; set; } = new(); /// /// Invoked after the "reload plugins" command is ran. /// - public static event CustomEventHandler ReloadedPlugins; + public static Event ReloadedPlugins { get; set; } = new(); /// /// Invoked after the "reload permissions" command is ran. /// - public static event CustomEventHandler ReloadedPermissions; + public static Event ReloadedPermissions { get; set; } = new(); /// /// Called before waiting for players. @@ -145,6 +149,12 @@ public static class Server /// The instance. public static void OnLocalReporting(LocalReportingEventArgs ev) => LocalReporting.InvokeSafely(ev); + /// + /// Called before a 's custom display name is changed. + /// + /// The instance. + public static void OnChoosingStartTeam(ChoosingStartTeamQueueEventArgs ev) => ChoosingStartTeamQueue.InvokeSafely(ev); + /// /// Called after the "reload configs" command is ran. /// diff --git a/Exiled.Events/Handlers/Warhead.cs b/Exiled.Events/Handlers/Warhead.cs index e6a28e9a75..48428866e6 100644 --- a/Exiled.Events/Handlers/Warhead.cs +++ b/Exiled.Events/Handlers/Warhead.cs @@ -7,15 +7,14 @@ namespace Exiled.Events.Handlers { - using Exiled.Events.EventArgs.Warhead; +#pragma warning disable SA1623 // Property summary documentation should match accessors - using Extensions; + using Exiled.Events.EventArgs.Warhead; + using Exiled.Events.Features; using PluginAPI.Core.Attributes; using PluginAPI.Enums; - using static Events; - /// /// Handles warhead related events. /// @@ -24,27 +23,27 @@ public class Warhead /// /// Invoked before stopping the warhead. /// - public static event CustomEventHandler Stopping; + public static Event Stopping { get; set; } = new(); /// /// Invoked before starting the warhead. /// - public static event CustomEventHandler Starting; + public static Event Starting { get; set; } = new(); /// /// Invoked before changing the warhead lever status. /// - public static event CustomEventHandler ChangingLeverStatus; + public static Event ChangingLeverStatus { get; set; } = new(); /// /// Invoked after the warhead has been detonated. /// - public static event CustomEventHandler Detonated; + public static Event Detonated { get; set; } = new(); /// /// Invoked before detonating the warhead. /// - public static event CustomEventHandler Detonating; + public static Event Detonating { get; set; } = new(); /// /// Called before stopping the warhead. @@ -72,15 +71,7 @@ public class Warhead /// /// Called before detonating the warhead. /// - /// Returns whether the event is allowed or not. - [PluginEvent(ServerEventType.WarheadDetonation)] - public bool OnDetonating() - { - DetonatingEventArgs ev = new(); - - Detonating.InvokeSafely(ev); - - return ev.IsAllowed; - } + /// The instance. + public static void OnDetonating(DetonatingEventArgs ev) => Detonating.InvokeSafely(ev); } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Cassie/SendingCassieMessage.cs b/Exiled.Events/Patches/Events/Cassie/SendingCassieMessage.cs index b87105b7f1..127751c7c6 100644 --- a/Exiled.Events/Patches/Events/Cassie/SendingCassieMessage.cs +++ b/Exiled.Events/Patches/Events/Cassie/SendingCassieMessage.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.Patches.Events.Cassie using System.Reflection.Emit; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Cassie; using Handlers; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Cassie /// Patches . /// Adds the event. /// + [EventPatch(typeof(Cassie), nameof(Cassie.SendingCassieMessage))] [HarmonyPatch(typeof(RespawnEffectsController), nameof(RespawnEffectsController.PlayCassieAnnouncement))] internal static class SendingCassieMessage { diff --git a/Exiled.Events/Patches/Events/Item/ChangingAmmo.cs b/Exiled.Events/Patches/Events/Item/ChangingAmmo.cs index 0ec0abc6a5..4031bda578 100644 --- a/Exiled.Events/Patches/Events/Item/ChangingAmmo.cs +++ b/Exiled.Events/Patches/Events/Item/ChangingAmmo.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.Patches.Events.Item using System.Reflection.Emit; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Item; using Handlers; @@ -21,12 +22,11 @@ namespace Exiled.Events.Patches.Events.Item using static HarmonyLib.AccessTools; - using Player = API.Features.Player; - /// /// Patches . /// Adds the event. /// + [EventPatch(typeof(Item), nameof(Item.ChangingAmmo))] [HarmonyPatch(typeof(Firearm), nameof(Firearm.Status), MethodType.Setter)] internal static class ChangingAmmo { diff --git a/Exiled.Events/Patches/Events/Item/ChangingAttachments.cs b/Exiled.Events/Patches/Events/Item/ChangingAttachments.cs index ce1d0cb6aa..8a2ab3fd27 100644 --- a/Exiled.Events/Patches/Events/Item/ChangingAttachments.cs +++ b/Exiled.Events/Patches/Events/Item/ChangingAttachments.cs @@ -13,7 +13,7 @@ namespace Exiled.Events.Patches.Events.Item using API.Features; using API.Features.Items; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Item; using HarmonyLib; @@ -29,6 +29,7 @@ namespace Exiled.Events.Patches.Events.Item /// . /// Adds the event. /// + [EventPatch(typeof(Handlers.Item), nameof(Handlers.Item.ChangingAttachments))] [HarmonyPatch(typeof(AttachmentsServerHandler), nameof(AttachmentsServerHandler.ServerReceiveChangeRequest))] internal static class ChangingAttachments { diff --git a/Exiled.Events/Patches/Events/Item/JailbirdPatch.cs b/Exiled.Events/Patches/Events/Item/JailbirdPatch.cs index 121fb2eee5..26e94e71d0 100644 --- a/Exiled.Events/Patches/Events/Item/JailbirdPatch.cs +++ b/Exiled.Events/Patches/Events/Item/JailbirdPatch.cs @@ -10,10 +10,10 @@ namespace Exiled.Events.Patches.Events.Item using System.Collections.Generic; using System.Reflection.Emit; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Item; using Handlers; using HarmonyLib; - using InventorySystem.Items.Firearms.Attachments; using InventorySystem.Items.Jailbird; using Mirror; using NorthwoodLib.Pools; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Item /// . /// Adds the event. /// + [EventPatch(typeof(Item), nameof(Item.Swinging))] [HarmonyPatch(typeof(JailbirdItem), nameof(JailbirdItem.ServerProcessCmd))] internal static class JailbirdPatch { diff --git a/Exiled.Events/Patches/Events/Item/KeycardInteracting.cs b/Exiled.Events/Patches/Events/Item/KeycardInteracting.cs index b56fef2413..97c4f4d23f 100644 --- a/Exiled.Events/Patches/Events/Item/KeycardInteracting.cs +++ b/Exiled.Events/Patches/Events/Item/KeycardInteracting.cs @@ -14,6 +14,7 @@ namespace Exiled.Events.Patches.Events.Item using API.Features.Pools; using Exiled.Events; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Item; using Footprinting; @@ -32,6 +33,7 @@ namespace Exiled.Events.Patches.Events.Item /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.InteractingDoor))] [HarmonyPatch(typeof(KeycardPickup), nameof(KeycardPickup.ProcessCollision))] internal static class KeycardInteracting { diff --git a/Exiled.Events/Patches/Events/Item/ReceivingPreference.cs b/Exiled.Events/Patches/Events/Item/ReceivingPreference.cs index e466a4e385..4efe28feb1 100644 --- a/Exiled.Events/Patches/Events/Item/ReceivingPreference.cs +++ b/Exiled.Events/Patches/Events/Item/ReceivingPreference.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Item using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Item; using Handlers; @@ -31,6 +31,7 @@ namespace Exiled.Events.Patches.Events.Item /// . /// Adds the event. /// + [EventPatch(typeof(Item), nameof(Item.ReceivingPreference))] [HarmonyPatch(typeof(AttachmentsServerHandler), nameof(AttachmentsServerHandler.ServerReceivePreference))] internal static class ReceivingPreference { diff --git a/Exiled.Events/Patches/Events/Map/AnnouncingDecontamination.cs b/Exiled.Events/Patches/Events/Map/AnnouncingDecontamination.cs index 8680d40969..b25fafcd75 100644 --- a/Exiled.Events/Patches/Events/Map/AnnouncingDecontamination.cs +++ b/Exiled.Events/Patches/Events/Map/AnnouncingDecontamination.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Map using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Handlers; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Map /// Patches . /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.AnnouncingDecontamination))] [HarmonyPatch(typeof(DecontaminationController), nameof(DecontaminationController.UpdateSpeaker))] internal static class AnnouncingDecontamination { diff --git a/Exiled.Events/Patches/Events/Map/AnnouncingNtfEntrance.cs b/Exiled.Events/Patches/Events/Map/AnnouncingNtfEntrance.cs index 4ff88a74db..f0a5c1a917 100644 --- a/Exiled.Events/Patches/Events/Map/AnnouncingNtfEntrance.cs +++ b/Exiled.Events/Patches/Events/Map/AnnouncingNtfEntrance.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Map using System.Text.RegularExpressions; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Handlers; @@ -27,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Map /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.AnnouncingNtfEntrance))] [HarmonyPatch(typeof(NineTailedFoxNamingRule), nameof(NineTailedFoxNamingRule.PlayEntranceAnnouncement))] internal static class AnnouncingNtfEntrance { diff --git a/Exiled.Events/Patches/Events/Map/AnnouncingScpTermination.cs b/Exiled.Events/Patches/Events/Map/AnnouncingScpTermination.cs index 5586d5d9de..1963f2b27d 100644 --- a/Exiled.Events/Patches/Events/Map/AnnouncingScpTermination.cs +++ b/Exiled.Events/Patches/Events/Map/AnnouncingScpTermination.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Map using API.Features.DamageHandlers; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Exiled.Events.Handlers; @@ -26,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Map /// . /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.AnnouncingScpTermination))] [HarmonyPatch(typeof(NineTailedFoxAnnouncer), nameof(NineTailedFoxAnnouncer.AnnounceScpTermination))] internal static class AnnouncingScpTermination { diff --git a/Exiled.Events/Patches/Events/Map/BreakingScp2176.cs b/Exiled.Events/Patches/Events/Map/BreakingScp2176.cs index 71668fa302..38c63853d0 100644 --- a/Exiled.Events/Patches/Events/Map/BreakingScp2176.cs +++ b/Exiled.Events/Patches/Events/Map/BreakingScp2176.cs @@ -7,12 +7,12 @@ namespace Exiled.Events.Patches.Events.Map { - using System; using System.Collections.Generic; using System.Reflection.Emit; using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Footprinting; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Map /// Patches . /// Supplements the event. /// + [EventPatch(typeof(Map), nameof(Map.ExplodingGrenade))] [HarmonyPatch(typeof(Scp2176Projectile), nameof(Scp2176Projectile.ServerShatter))] internal static class BreakingScp2176 { diff --git a/Exiled.Events/Patches/Events/Map/ChangingIntoGrenade.cs b/Exiled.Events/Patches/Events/Map/ChangingIntoGrenade.cs index f978edb174..adf30cc981 100644 --- a/Exiled.Events/Patches/Events/Map/ChangingIntoGrenade.cs +++ b/Exiled.Events/Patches/Events/Map/ChangingIntoGrenade.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Map using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Handlers; @@ -30,8 +30,10 @@ namespace Exiled.Events.Patches.Events.Map /// /// Patches . - /// Adds the event. + /// Adds the and events. /// + [EventPatch(typeof(Map), nameof(Map.ChangingIntoGrenade))] + [EventPatch(typeof(Map), nameof(Map.ChangedIntoGrenade))] [HarmonyPatch(typeof(TimedGrenadePickup), nameof(TimedGrenadePickup.Update))] internal static class ChangingIntoGrenade { diff --git a/Exiled.Events/Patches/Events/Map/Decontaminating.cs b/Exiled.Events/Patches/Events/Map/Decontaminating.cs index 2dbcad3400..d53935d062 100644 --- a/Exiled.Events/Patches/Events/Map/Decontaminating.cs +++ b/Exiled.Events/Patches/Events/Map/Decontaminating.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Map using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Handlers; @@ -24,8 +24,9 @@ namespace Exiled.Events.Patches.Events.Map /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.Decontaminating))] [HarmonyPatch(typeof(DecontaminationController), nameof(DecontaminationController.FinishDecontamination))] internal static class Decontaminating { diff --git a/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs b/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs index 9a0e4ab756..b5cbc6ab8a 100644 --- a/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs +++ b/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs @@ -13,8 +13,8 @@ namespace Exiled.Events.Patches.Events.Map using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; - using Footprinting; using HarmonyLib; using InventorySystem.Items.ThrowableProjectiles; using UnityEngine; @@ -24,10 +24,11 @@ namespace Exiled.Events.Patches.Events.Map using ExiledEvents = Exiled.Events.Events; /// - /// Patches . - /// Adds the event. + /// Patches . + /// Adds the event. /// - [HarmonyPatch(typeof(FlashbangGrenade), nameof(FlashbangGrenade.PlayExplosionEffects))] + [EventPatch(typeof(Handlers.Map), nameof(Handlers.Map.ExplodingGrenade))] + [HarmonyPatch(typeof(FlashbangGrenade), nameof(FlashbangGrenade.ServerFuseEnd))] internal static class ExplodingFlashGrenade { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) @@ -46,13 +47,15 @@ private static IEnumerable Transpiler(IEnumerable i.opcode == OpCodes.Ble_S) - 3].WithLabels(returnLabel); for (int z = 0; z < newInstructions.Count; z++) yield return newInstructions[z]; @@ -60,23 +63,29 @@ private static IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } - private static void ProcessEvent(FlashbangGrenade instance) + private static int ProcessEvent(FlashbangGrenade instance) { ExplodingGrenadeEventArgs explodingGrenadeEvent = new ExplodingGrenadeEventArgs(Player.Get(instance.PreviousOwner.Hub), instance); Handlers.Map.OnExplodingGrenade(explodingGrenadeEvent); if (!explodingGrenadeEvent.IsAllowed) - return; + return 0; + int size = 0; foreach (Player player in explodingGrenadeEvent.TargetsToAffect) { if (!ExiledEvents.Instance.Config.CanFlashbangsAffectThrower && explodingGrenadeEvent.Player == player) continue; if (HitboxIdentity.CheckFriendlyFire(explodingGrenadeEvent.Player.ReferenceHub, player.ReferenceHub)) + { instance.ProcessPlayer(player.ReferenceHub); + size++; + } } + + return size; } private static List ConvertHubs(List hubs) => hubs.Select(Player.Get).ToList(); diff --git a/Exiled.Events/Patches/Events/Map/ExplodingFragGrenade.cs b/Exiled.Events/Patches/Events/Map/ExplodingFragGrenade.cs index bb86edba44..1808ec2fb3 100644 --- a/Exiled.Events/Patches/Events/Map/ExplodingFragGrenade.cs +++ b/Exiled.Events/Patches/Events/Map/ExplodingFragGrenade.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Map using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Footprinting; @@ -27,8 +27,9 @@ namespace Exiled.Events.Patches.Events.Map /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Map), nameof(Handlers.Map.ExplodingGrenade))] [HarmonyPatch(typeof(ExplosionGrenade), nameof(ExplosionGrenade.Explode))] internal static class ExplodingFragGrenade { @@ -73,8 +74,6 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Map +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Map; + + using HarmonyLib; + + using InventorySystem.Items.Pickups; + + using MapGeneration.Distributors; + + using static HarmonyLib.AccessTools; + + /// + /// Patches . + /// Adds the event. + /// + [EventPatch(typeof(Handlers.Map), nameof(Handlers.Map.FillingLocker))] + [HarmonyPatch(typeof(LockerChamber), nameof(LockerChamber.SpawnItem))] + internal static class FillingLocker + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label returnLabel = generator.DefineLabel(); + + int offset = -3; + int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(HashSet), nameof(HashSet.Add), new[] { typeof(ItemPickupBase) }))) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // FillingLockerEventArgs ev = new(ItemPickupBase, loockerChamber) + new(OpCodes.Ldloc_S, 4), + new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Newobj, GetDeclaredConstructors(typeof(FillingLockerEventArgs))[0]), + new(OpCodes.Dup), + + // Map.OnFillingLocker(ev) + new(OpCodes.Call, Method(typeof(Handlers.Map), nameof(Handlers.Map.OnFillingLocker))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(FillingLockerEventArgs), nameof(FillingLockerEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, returnLabel), + }); + + newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} diff --git a/Exiled.Events/Patches/Events/Map/GeneratorActivated.cs b/Exiled.Events/Patches/Events/Map/GeneratorActivating.cs similarity index 85% rename from Exiled.Events/Patches/Events/Map/GeneratorActivated.cs rename to Exiled.Events/Patches/Events/Map/GeneratorActivating.cs index 1856eec3f5..32f1c23ac4 100644 --- a/Exiled.Events/Patches/Events/Map/GeneratorActivated.cs +++ b/Exiled.Events/Patches/Events/Map/GeneratorActivating.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Map using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Map; using Handlers; @@ -25,21 +25,20 @@ namespace Exiled.Events.Patches.Events.Map /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.GeneratorActivating))] [HarmonyPatch(typeof(Scp079Generator), nameof(Scp079Generator.Engaged), MethodType.Setter)] - internal static class GeneratorActivated + internal static class GeneratorActivating { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - const int index = 0; - Label retModLabel = generator.DefineLabel(); Label returnLabel = generator.DefineLabel(); - LocalBuilder ev = generator.DeclareLocal(typeof(GeneratorActivatedEventArgs)); + LocalBuilder ev = generator.DeclareLocal(typeof(GeneratorActivatingEventArgs)); // GeneratorActivatedEventArgs ev = new(this, true); // @@ -48,7 +47,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Map), nameof(Handlers.Map.PlacingBlood))] [HarmonyPatch(typeof(StandardHitregBase), nameof(StandardHitregBase.PlaceBloodDecal))] internal static class PlacingBlood { diff --git a/Exiled.Events/Patches/Events/Map/PlacingBulletHole.cs b/Exiled.Events/Patches/Events/Map/PlacingBulletHole.cs index 799b829f0a..173267283e 100644 --- a/Exiled.Events/Patches/Events/Map/PlacingBulletHole.cs +++ b/Exiled.Events/Patches/Events/Map/PlacingBulletHole.cs @@ -12,6 +12,9 @@ namespace Exiled.Events.Patches.Events.Map using API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Map; + using Handlers; using HarmonyLib; @@ -28,6 +31,7 @@ namespace Exiled.Events.Patches.Events.Map /// Patches . /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.PlacingBulletHole))] [HarmonyPatch(typeof(StandardHitregBase), nameof(StandardHitregBase.PlaceBulletholeDecal))] internal static class PlacingBulletHole { @@ -37,7 +41,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable. /// Adds the event. /// + [EventPatch(typeof(Map), nameof(Map.SpawningItem))] [HarmonyPatch(typeof(ItemDistributor), nameof(ItemDistributor.CreatePickup))] internal static class SpawningItem { @@ -131,7 +131,7 @@ private static IEnumerable Transpiler(IEnumerable - /// Patches . + /// Patches . /// Adds the event. /// - [HarmonyPatch(typeof(FlickerableLightController), nameof(FlickerableLightController.ServerFlickerLights))] + [EventPatch(typeof(Handlers.Map), nameof(Handlers.Map.TurningOffLights))] + [HarmonyPatch(typeof(RoomLightController), nameof(RoomLightController.ServerFlickerLights))] internal static class TurningOffLights { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) diff --git a/Exiled.Events/Patches/Events/Player/ActivatingWarheadPanel.cs b/Exiled.Events/Patches/Events/Player/ActivatingWarheadPanel.cs index 543d07784c..ffc7665ea3 100644 --- a/Exiled.Events/Patches/Events/Player/ActivatingWarheadPanel.cs +++ b/Exiled.Events/Patches/Events/Player/ActivatingWarheadPanel.cs @@ -7,14 +7,16 @@ namespace Exiled.Events.Patches.Events.Player { + using System; using System.Collections.Generic; using System.Reflection.Emit; using API.Features; using API.Features.Pools; - + using Exiled.API.Enums; + using Exiled.API.Features.Items; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; - using HarmonyLib; using static HarmonyLib.AccessTools; @@ -23,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ActivatingWarheadPanel))] [HarmonyPatch(typeof(PlayerInteract), nameof(PlayerInteract.UserCode_CmdSwitchAWButton))] internal static class ActivatingWarheadPanel { @@ -30,121 +33,82 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - LocalBuilder isAllowed = generator.DeclareLocal(typeof(bool)); - LocalBuilder cmp_0x01 = generator.DeclareLocal(typeof(bool)); - - Label jne = generator.DefineLabel(); - Label ceq = generator.DefineLabel(); - Label je = generator.DefineLabel(); - Label jmp = generator.DefineLabel(); - Label cmp = generator.DefineLabel(); - Label ret = generator.DefineLabel(); - - int offset = 1; - int index = newInstructions.FindIndex(instruction => instruction.LoadsField(Field(typeof(ServerRoles), nameof(ServerRoles.BypassMode)))) + offset; - - // Remove brtrue.s - newInstructions.RemoveAt(index); - - offset = -3; - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Isinst) + offset; - - newInstructions[index].labels.Add(jne); - - newInstructions.InsertRange( - index, - new CodeInstruction[] - { - // bypassmode check - new(OpCodes.Stloc_S, isAllowed.LocalIndex), - new(OpCodes.Ldloc_S, isAllowed.LocalIndex), - new(OpCodes.Brfalse_S, jne), - - // isAllowed = true - new(OpCodes.Ldc_I4_1), - new(OpCodes.Stloc_S, isAllowed.LocalIndex), - - // goto jmp - new(OpCodes.Br_S, jmp), - }); - - offset = 1; - index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Stloc_1) + offset; - - // Remove brfalse.s - newInstructions.RemoveAt(index); + Label continueLabel = generator.DefineLabel(); + Label ev = generator.DefineLabel(); + Label cardCheck = generator.DefineLabel(); - offset = 1; - index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Stloc_1) + offset; + LocalBuilder player = generator.DeclareLocal(typeof(Player)); + LocalBuilder allowed = generator.DeclareLocal(typeof(bool)); + LocalBuilder card = generator.DeclareLocal(typeof(Keycard)); - newInstructions.InsertRange( - index, - new[] - { - // Item null check - new(OpCodes.Brfalse_S, ceq), + int index = newInstructions.FindIndex(i => i.Is(OpCodes.Ldfld, Field(typeof(PlayerInteract), nameof(PlayerInteract._sr)))); - // cmp_0x01 = true - new(OpCodes.Ldc_I4_1), - new(OpCodes.Stloc_S, cmp_0x01.LocalIndex), - new(OpCodes.Br_S, je), - - // ceq: - // - // cmp_0x01 = false - new CodeInstruction(OpCodes.Ldc_I4_0).WithLabels(ceq), - new(OpCodes.Stloc_S, cmp_0x01.LocalIndex), - - // je: - // - // if (!cmp_0x01) - // goto jmp; - new CodeInstruction(OpCodes.Ldloc_S, cmp_0x01.LocalIndex).WithLabels(je), - new(OpCodes.Brfalse_S, jmp), - }); + newInstructions.RemoveRange(index, 17); - offset = -1; - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldloc_0) + offset; - - // Remove brfalse.s - newInstructions.RemoveAt(index); - - offset = 0; - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldloc_0) + offset; + newInstructions[index].labels.Add(continueLabel); newInstructions.InsertRange( index, new[] { - // isAllowed = cmp_0x01 == hasFlagCheck - new(OpCodes.Ldloc_S, cmp_0x01.LocalIndex), - new(OpCodes.Ceq), - new(OpCodes.Stloc_S, isAllowed.LocalIndex), - - // jmp: - // - // Player.Get(this._hub) - new CodeInstruction(OpCodes.Ldarg_0).WithLabels(jmp), + // Player player = Player.Get(this._hub); new(OpCodes.Ldfld, Field(typeof(PlayerInteract), nameof(PlayerInteract._hub))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + new(OpCodes.Stloc_S, player.LocalIndex), - // isAllowed - new(OpCodes.Ldloc_S, isAllowed.LocalIndex), + // allowed = false; + new(OpCodes.Ldc_I4_0), + new(OpCodes.Stloc_S, allowed.LocalIndex), - // ActivatingWarheadPanelEventArgs ev = new(Player, bool) + // if (player.IsBypassModeEnabled) + // allowed = true; + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.IsBypassModeEnabled))), + new(OpCodes.Brfalse_S, cardCheck), + + new(OpCodes.Ldc_I4_1), + new(OpCodes.Stloc_S, allowed.LocalIndex), + new(OpCodes.Br_S, ev), + + // if (player.CurrentItem != null && player.CurrentItem is Keycard card && card.Permissions.HasFlag(KeycardPermissions.AlphaWarhead)) + // allowed = true; + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).WithLabels(cardCheck), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.CurrentItem))), + new(OpCodes.Brfalse_S, ev), + new(OpCodes.Ldloc_S, player.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.CurrentItem))), + new(OpCodes.Isinst, typeof(Keycard)), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, card.LocalIndex), + new(OpCodes.Brfalse_S, ev), + new(OpCodes.Ldloc_S, card.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(Keycard), nameof(Keycard.Permissions))), + new(OpCodes.Box, typeof(KeycardPermissions)), + new(OpCodes.Ldc_I4_8), + new(OpCodes.Box, typeof(KeycardPermissions)), + new(OpCodes.Call, Method(typeof(Enum), nameof(Enum.HasFlag))), + new(OpCodes.Stloc_S, allowed.LocalIndex), + + // player + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).WithLabels(ev), + + // allowed + new(OpCodes.Ldloc_S, allowed.LocalIndex), + + // ActivatingWarheadPanekEventArgs ev = new(player, allowed); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ActivatingWarheadPanelEventArgs))[0]), new(OpCodes.Dup), - // Handlers.Player.OnActivatingWarheadPanel(ev) + // Handlers.Player.OnActivatingWarheadPanel(ev); new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnActivatingWarheadPanel))), // if (!ev.IsAllowed) - // return; + // return; new(OpCodes.Callvirt, PropertyGetter(typeof(ActivatingWarheadPanelEventArgs), nameof(ActivatingWarheadPanelEventArgs.IsAllowed))), - new(OpCodes.Brfalse_S, ret), - }); + new(OpCodes.Brtrue_S, continueLabel), - newInstructions[newInstructions.Count - 1].WithLabels(ret); + new(OpCodes.Ret), + }); for (int z = 0; z < newInstructions.Count; z++) yield return newInstructions[z]; diff --git a/Exiled.Events/Patches/Events/Player/ActivatingWorkstation.cs b/Exiled.Events/Patches/Events/Player/ActivatingWorkstation.cs index 2cc4b4b40f..9eed28a67d 100644 --- a/Exiled.Events/Patches/Events/Player/ActivatingWorkstation.cs +++ b/Exiled.Events/Patches/Events/Player/ActivatingWorkstation.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ActivatingWorkstation))] [HarmonyPatch(typeof(WorkstationController), nameof(WorkstationController.ServerInteract))] internal static class ActivatingWorkstation { diff --git a/Exiled.Events/Patches/Events/Player/Banned.cs b/Exiled.Events/Patches/Events/Player/Banned.cs index 14ea144c10..8b166e5062 100644 --- a/Exiled.Events/Patches/Events/Player/Banned.cs +++ b/Exiled.Events/Patches/Events/Player/Banned.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -23,6 +23,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Banned))] [HarmonyPatch(typeof(BanHandler), nameof(BanHandler.IssueBan))] internal static class Banned { diff --git a/Exiled.Events/Patches/Events/Player/Banning.cs b/Exiled.Events/Patches/Events/Player/Banning.cs index 63ab65ccc1..177eab623f 100644 --- a/Exiled.Events/Patches/Events/Player/Banning.cs +++ b/Exiled.Events/Patches/Events/Player/Banning.cs @@ -7,116 +7,114 @@ namespace Exiled.Events.Patches.Events.Player { -#pragma warning disable SA1313 - using System; + using System.Collections.Generic; + using System.Reflection.Emit; using API.Features; - using CommandSystem; - + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; - + using Footprinting; using HarmonyLib; - using PluginAPI.Enums; - using PluginAPI.Events; - - using Log = API.Features.Log; + using static HarmonyLib.AccessTools; /// - /// Patches . + /// Patches . /// Adds the event. /// - [HarmonyPatch(typeof(BanPlayer), nameof(BanPlayer.BanUser), typeof(ReferenceHub), typeof(ICommandSender), typeof(string), typeof(long))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Banning))] + [HarmonyPatch(typeof(BanPlayer), nameof(BanPlayer.BanUser), typeof(Footprint), typeof(ICommandSender), typeof(string), typeof(long))] internal static class Banning { - private static bool Prefix(ReferenceHub target, ICommandSender issuer, string reason, long duration, ref bool __result) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - try - { - if (duration == 0L) - { - __result = BanPlayer.KickUser(target, issuer, reason); - return false; - } + List newInstructions = ListPool.Pool.Get(instructions); + + Label notEmpty = generator.DefineLabel(); + Label empty = generator.DefineLabel(); + Label continueLabel = generator.DefineLabel(); + + LocalBuilder ev = generator.DeclareLocal(typeof(BanningEventArgs)); + LocalBuilder msg = generator.DeclareLocal(typeof(string)); - if (duration > long.MaxValue) - duration = long.MaxValue; + int offset = 1; + int index = newInstructions.FindLastIndex(x => x.opcode == OpCodes.Starg_S) + offset; - if (target.serverRoles.BypassStaff) + newInstructions.InsertRange( + index, + new[] { - __result = false; - return false; - } + new(OpCodes.Ldarg_0), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(Footprint) })), - long issuanceTime = TimeBehaviour.CurrentTimestamp(); - long banExpirationTime = TimeBehaviour.GetBanExpirationTime((uint)duration); - string originalName = BanPlayer.ValidateNick(target.nicknameSync.MyNick); - string message = $"You have been banned. {(!string.IsNullOrEmpty(reason) ? "Reason: " + reason : string.Empty)}"; + new(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ICommandSender) })), - BanningEventArgs ev = new(Player.Get(target), Player.Get(issuer), duration, reason, message); + new(OpCodes.Ldarg_3), - Handlers.Player.OnBanning(ev); + new(OpCodes.Ldarg_2), - if (!ev.IsAllowed) - { - __result = false; - return false; - } + new(OpCodes.Ldstr, "You have been banned. "), + new(OpCodes.Ldarg_2), + new(OpCodes.Call, Method(typeof(string), nameof(string.IsNullOrEmpty))), + new(OpCodes.Brfalse_S, notEmpty), + new(OpCodes.Ldsfld, Field(typeof(string), nameof(string.Empty))), + new(OpCodes.Br_S, empty), + new CodeInstruction(OpCodes.Ldstr, "Reason: ").WithLabels(notEmpty), + new(OpCodes.Ldarg_2), + new(OpCodes.Call, Method(typeof(string), nameof(string.Concat), new[] { typeof(string), typeof(string) })), + new CodeInstruction(OpCodes.Call, Method(typeof(string), nameof(string.Concat), new[] { typeof(string), typeof(string) })).WithLabels(empty), - duration = ev.Duration; - reason = ev.Reason; - message = ev.FullMessage; + new(OpCodes.Ldc_I4_1), - if (!EventManager.ExecuteEvent(ServerEventType.PlayerBanned, new object[] - { - target, - issuer, - reason, - duration, - })) - { - __result = false; - return false; - } - - BanPlayer.ApplyIpBan(target, issuer, reason, duration); - - BanHandler.IssueBan( - new BanDetails - { - OriginalName = originalName, - Id = target.characterClassManager.UserId, - IssuanceTime = issuanceTime, - Expires = banExpirationTime, - Reason = reason, - Issuer = issuer.LogName, - }, BanHandler.BanType.UserId); - - if (!string.IsNullOrEmpty(target.characterClassManager.UserId2)) - { - BanHandler.IssueBan( - new BanDetails - { - OriginalName = originalName, - Id = target.characterClassManager.UserId2, - IssuanceTime = issuanceTime, - Expires = banExpirationTime, - Reason = reason, - Issuer = issuer.LogName, - }, BanHandler.BanType.UserId); - } - - ServerConsole.Disconnect(target.gameObject, message); - - __result = true; - return false; - } - catch (Exception exception) - { - Log.Error($"Exiled.Events.Patches.Events.Player.Banning: {exception}\n{exception.StackTrace}"); - return true; - } + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(BanningEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev.LocalIndex), + + new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnBanning))), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + new(OpCodes.Ret), + + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex).WithLabels(continueLabel), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Dup), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.Reason))), + new(OpCodes.Starg_S, 2), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.Duration))), + new(OpCodes.Starg_S, 3), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.Player))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.Sender))), + new(OpCodes.Starg_S, 1), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.Target))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.Footprint))), + new(OpCodes.Starg_S, 0), + + new(OpCodes.Callvirt, PropertyGetter(typeof(BanningEventArgs), nameof(BanningEventArgs.FullMessage))), + new(OpCodes.Stloc_S, msg.LocalIndex), + }); + + index = newInstructions.FindLastIndex(x => x.opcode == OpCodes.Ldstr); + + newInstructions.RemoveRange(index, 3); + + newInstructions.Insert(index, new(OpCodes.Ldloc_S, msg.LocalIndex)); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/ChangedItem.cs b/Exiled.Events/Patches/Events/Player/ChangedItem.cs index b88d3ebaa1..b31f4c54e1 100644 --- a/Exiled.Events/Patches/Events/Player/ChangedItem.cs +++ b/Exiled.Events/Patches/Events/Player/ChangedItem.cs @@ -7,21 +7,17 @@ namespace Exiled.Events.Patches.Events.Player { - using System; using System.Collections.Generic; - using System.Reflection; using System.Reflection.Emit; using API.Features; - using API.Features.Items; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; using InventorySystem; - using InventorySystem.Items; using static HarmonyLib.AccessTools; @@ -29,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangedItem))] [HarmonyPatch(typeof(Inventory), nameof(Inventory.CurInstance), MethodType.Setter)] internal static class ChangedItem { diff --git a/Exiled.Events/Patches/Events/Player/ChangingGroup.cs b/Exiled.Events/Patches/Events/Player/ChangingGroup.cs index aeae1ac1a5..d2d57826bf 100644 --- a/Exiled.Events/Patches/Events/Player/ChangingGroup.cs +++ b/Exiled.Events/Patches/Events/Player/ChangingGroup.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -22,8 +23,9 @@ namespace Exiled.Events.Patches.Events.Player /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingGroup))] [HarmonyPatch(typeof(ServerRoles), nameof(ServerRoles.SetGroup))] internal static class ChangingGroup { diff --git a/Exiled.Events/Patches/Events/Player/ChangingItem.cs b/Exiled.Events/Patches/Events/Player/ChangingItem.cs index 8292b34475..f24c1c4aec 100644 --- a/Exiled.Events/Patches/Events/Player/ChangingItem.cs +++ b/Exiled.Events/Patches/Events/Player/ChangingItem.cs @@ -13,7 +13,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Items; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -27,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingItem))] [HarmonyPatch(typeof(Inventory), nameof(Inventory.ServerSelectItem))] internal static class ChangingItem { @@ -73,13 +74,13 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingMicroHIDState))] [HarmonyPatch(typeof(MicroHIDItem), nameof(MicroHIDItem.ExecuteServerside))] internal static class ChangingMicroHIDState { diff --git a/Exiled.Events/Patches/Events/Player/ChangingMoveState.cs b/Exiled.Events/Patches/Events/Player/ChangingMoveState.cs index f11e2dae4d..24f82f790e 100644 --- a/Exiled.Events/Patches/Events/Player/ChangingMoveState.cs +++ b/Exiled.Events/Patches/Events/Player/ChangingMoveState.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Events.Handlers; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches setter. /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.ChangingMoveState))] [HarmonyPatch(typeof(FirstPersonMovementModule), nameof(FirstPersonMovementModule.SyncMovementState), MethodType.Setter)] internal static class ChangingMoveState { @@ -71,22 +73,11 @@ private static IEnumerable Transpiler(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Player +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Player; + + using HarmonyLib; + + using static HarmonyLib.AccessTools; + + /// + /// Patches to add the event. + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingNickname))] + [HarmonyPatch(typeof(NicknameSync), nameof(NicknameSync.Network_displayName), MethodType.Setter)] + internal static class ChangingNickname + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + Label continueLabel = generator.DefineLabel(); + + const int offset = 1; + int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Brtrue) + offset; + + newInstructions.InsertRange(index, new[] + { + // Player.Get(this._hub); + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(NicknameSync), nameof(NicknameSync._hub))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // value; + new(OpCodes.Ldarg_1), + + // new ChangingNicknameEventArgs(Player.Get(this._hub, value) + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChangingNicknameEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + + // Handlers.Player.OnChangingNickname(ev); + new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnChangingNickname))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingNicknameEventArgs), nameof(ChangingNicknameEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + new(OpCodes.Pop), + new(OpCodes.Ret), + new CodeInstruction(OpCodes.Callvirt, PropertyGetter(typeof(ChangingNicknameEventArgs), nameof(ChangingNicknameEventArgs.NewName))).WithLabels(continueLabel), + new(OpCodes.Starg_S, 1), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/ChangingRadioPreset.cs b/Exiled.Events/Patches/Events/Player/ChangingRadioPreset.cs index 4b2fa6a566..c76e77ee36 100644 --- a/Exiled.Events/Patches/Events/Player/ChangingRadioPreset.cs +++ b/Exiled.Events/Patches/Events/Player/ChangingRadioPreset.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingRadioPreset))] [HarmonyPatch(typeof(RadioItem), nameof(RadioItem.ServerProcessCmd))] internal static class ChangingRadioPreset { @@ -37,8 +38,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + const int offset = -5; + int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, diff --git a/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs b/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs index 04ec3d801a..c852115f83 100644 --- a/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs +++ b/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs @@ -16,6 +16,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Pools; using API.Features.Roles; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -45,6 +46,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(GameObjectPools.PoolObject), nameof(GameObjectPools.PoolObject.SpawnPoolObject)))) + offset; + instruction => instruction.Calls(Method(typeof(GameObjectPools.PoolObject), nameof(GameObjectPools.PoolObject.SetupPoolObject)))) + offset; newInstructions[index].WithLabels(continueLabel1); @@ -151,6 +166,11 @@ private static IEnumerable Transpiler(IEnumerable setter. /// Adds the . /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ChangingSpectatedPlayer))] [HarmonyPatch(typeof(SpectatorRole), nameof(SpectatorRole.SyncedSpectatedNetId), MethodType.Setter)] internal static class ChangingSpectatedPlayerPatch { diff --git a/Exiled.Events/Patches/Events/Player/DamagingDoor.cs b/Exiled.Events/Patches/Events/Player/DamagingDoor.cs new file mode 100644 index 0000000000..b6ea62c519 --- /dev/null +++ b/Exiled.Events/Patches/Events/Player/DamagingDoor.cs @@ -0,0 +1,87 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Player +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features.DamageHandlers; + using API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Player; + + using Handlers; + + using HarmonyLib; + using Interactables.Interobjects; + using Interactables.Interobjects.DoorUtils; + using UnityEngine; + + using static HarmonyLib.AccessTools; + + /// + /// Patch the . + /// Adds the event. + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.DamagingDoor))] + [HarmonyPatch(typeof(BreakableDoor), nameof(BreakableDoor.ServerDamage))] + internal static class DamagingDoor + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + LocalBuilder ev = generator.DeclareLocal(typeof(DamagingDoorEventArgs)); + + Label ret = generator.DefineLabel(); + + int offset = -3; + int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldarg_1) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // this + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + + // damage + new(OpCodes.Ldarg_1), + + // DoorDamageType + new(OpCodes.Ldarg_2), + + // DamagingDoorEventArgs ev = new(player, this, doorDamageType); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(DamagingDoorEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc, ev.LocalIndex), + + // Handlers.Player.OnDamagingDoor(ev); + new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnDamagingDoor))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(DamagingDoorEventArgs), nameof(DamagingDoorEventArgs.IsAllowed))), + new(OpCodes.Brfalse, ret), + + // damage = ev.Handler.Damage; + new(OpCodes.Ldloc, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(DamagingDoorEventArgs), nameof(DamagingDoorEventArgs.Damage))), + new(OpCodes.Starg_S, 1), + }); + + newInstructions[newInstructions.Count - 1].WithLabels(ret); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/DamagingShootingTarget.cs b/Exiled.Events/Patches/Events/Player/DamagingShootingTarget.cs index 49f5f50746..5ee191c36e 100644 --- a/Exiled.Events/Patches/Events/Player/DamagingShootingTarget.cs +++ b/Exiled.Events/Patches/Events/Player/DamagingShootingTarget.cs @@ -14,7 +14,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -29,6 +29,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.DamagingShootingTarget))] [HarmonyPatch(typeof(ShootingTarget), nameof(ShootingTarget.Damage))] internal static class DamagingShootingTarget { @@ -53,7 +54,7 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.PlayerDamageWindow))] [HarmonyPatch(typeof(BreakableWindow), nameof(BreakableWindow.Damage))] internal static class DamagingWindow { @@ -38,8 +39,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + int offset = -5; + int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, diff --git a/Exiled.Events/Patches/Events/Player/DeactivatingWorkstation.cs b/Exiled.Events/Patches/Events/Player/DeactivatingWorkstation.cs index f8f9390e94..4a1cc6da26 100644 --- a/Exiled.Events/Patches/Events/Player/DeactivatingWorkstation.cs +++ b/Exiled.Events/Patches/Events/Player/DeactivatingWorkstation.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Handlers; @@ -25,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.DeactivatingWorkstation))] [HarmonyPatch(typeof(WorkstationController), nameof(WorkstationController.NetworkStatus), MethodType.Setter)] internal static class DeactivatingWorkstation { diff --git a/Exiled.Events/Patches/Events/Player/Destroying.cs b/Exiled.Events/Patches/Events/Player/Destroying.cs index bd93cc863e..e0fef8f8e6 100644 --- a/Exiled.Events/Patches/Events/Player/Destroying.cs +++ b/Exiled.Events/Patches/Events/Player/Destroying.cs @@ -7,15 +7,13 @@ namespace Exiled.Events.Patches.Events.Player { -#pragma warning disable SA1600 - using System.Collections.Generic; using System.Reflection.Emit; using System.Runtime.CompilerServices; using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +22,10 @@ namespace Exiled.Events.Patches.Events.Player using static HarmonyLib.AccessTools; + /// + /// Patch the . + /// Adds the event. + /// [HarmonyPatch(typeof(ReferenceHub), nameof(ReferenceHub.OnDestroy))] internal static class Destroying { @@ -32,6 +34,7 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); Label continueLabel = generator.DefineLabel(); + Label jmp = generator.DefineLabel(); LocalBuilder player = generator.DeclareLocal(typeof(Player)); @@ -53,8 +56,21 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable), nameof(Dictionary.Remove), new[] { typeof(GameObject) })), new(OpCodes.Pop), - // Player.UnverifiedPlayers.Remove(this) + // Player.UnverifiedPlayers.Remove(this.gameObject) new(OpCodes.Call, PropertyGetter(typeof(Player), nameof(Player.UnverifiedPlayers))), new(OpCodes.Ldarg_0), + new(OpCodes.Call, PropertyGetter(typeof(ReferenceHub), nameof(ReferenceHub.gameObject))), new(OpCodes.Callvirt, Method(typeof(ConditionalWeakTable), nameof(ConditionalWeakTable.Remove), new[] { typeof(ReferenceHub) })), new(OpCodes.Pop), - // Player.IdsCache.Remove(player.Id) - new(OpCodes.Call, PropertyGetter(typeof(Player), nameof(Player.IdsCache))), - new(OpCodes.Ldloc_S, player.LocalIndex), - new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.Id))), - new(OpCodes.Callvirt, Method(typeof(Dictionary), nameof(Dictionary.Remove), new[] { typeof(int) })), - new(OpCodes.Pop), - // if (player.UserId == null) // goto continueLabel; new(OpCodes.Ldloc_S, player.LocalIndex), diff --git a/Exiled.Events/Patches/Events/Player/DroppingAmmo.cs b/Exiled.Events/Patches/Events/Player/DroppingAmmo.cs index 9930dbef35..e617dd2090 100644 --- a/Exiled.Events/Patches/Events/Player/DroppingAmmo.cs +++ b/Exiled.Events/Patches/Events/Player/DroppingAmmo.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -22,10 +22,11 @@ namespace Exiled.Events.Patches.Events.Player using static HarmonyLib.AccessTools; /// - /// Patches . - /// Adds the event. + /// Patches . + /// Adds the event. /// - [HarmonyPatch(typeof(Inventory), nameof(Inventory.UserCode_CmdDropAmmo))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.DroppingAmmo))] + [HarmonyPatch(typeof(Inventory), nameof(Inventory.UserCode_CmdDropAmmo__Byte__UInt16))] internal static class DroppingAmmo { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) @@ -45,6 +46,7 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event. + /// Adds the and event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Dying))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Died))] [HarmonyPatch(typeof(PlayerStats), nameof(PlayerStats.KillPlayer))] internal static class DyingAndDied { @@ -50,6 +52,8 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.EnteringKillerCollision))] [HarmonyPatch(typeof(CheckpointKiller), nameof(CheckpointKiller.OnTriggerEnter))] internal static class EnteringKillerCollision { diff --git a/Exiled.Events/Patches/Events/Player/EnteringPocketDimension.cs b/Exiled.Events/Patches/Events/Player/EnteringPocketDimension.cs index 32c450a09f..210a7d8c60 100644 --- a/Exiled.Events/Patches/Events/Player/EnteringPocketDimension.cs +++ b/Exiled.Events/Patches/Events/Player/EnteringPocketDimension.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.EnteringPocketDimension))] [HarmonyPatch(typeof(Scp106Attack), nameof(Scp106Attack.ServerShoot))] internal static class EnteringPocketDimension { @@ -36,8 +38,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Endfinally) + offset; + int offset = 0; + int index = newInstructions.FindLastIndex(instruction => instruction.LoadsField(Field(typeof(Scp106Attack), nameof(Scp106Attack.OnPlayerTeleported)))) + offset; // EnteringPocketDimensionEventArgs ev = new(Player.Get(this._targetHub), Player.Get(base.Owner), true); // diff --git a/Exiled.Events/Patches/Events/Player/EnteringSinkholeEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/EnteringSinkholeEnvironmentalHazard.cs index b1111bbb8b..2bccead6f4 100644 --- a/Exiled.Events/Patches/Events/Player/EnteringSinkholeEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/EnteringSinkholeEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.EnteringEnvironmentalHazard))] [HarmonyPatch(typeof(SinkholeEnvironmentalHazard), nameof(SinkholeEnvironmentalHazard.OnEnter))] internal static class EnteringSinkholeEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/EnteringTantrumEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/EnteringTantrumEnvironmentalHazard.cs index 7499c80104..faea5e7787 100644 --- a/Exiled.Events/Patches/Events/Player/EnteringTantrumEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/EnteringTantrumEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +24,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.EnteringEnvironmentalHazard))] [HarmonyPatch(typeof(TantrumEnvironmentalHazard), nameof(TantrumEnvironmentalHazard.OnEnter))] internal static class EnteringTantrumEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/Escaping.cs b/Exiled.Events/Patches/Events/Player/Escaping.cs index 99eb55fb4c..75d8a50114 100644 --- a/Exiled.Events/Patches/Events/Player/Escaping.cs +++ b/Exiled.Events/Patches/Events/Player/Escaping.cs @@ -7,20 +7,31 @@ namespace Exiled.Events.Patches.Events.Player { +#pragma warning disable SA1402 // File may only contain a single type +#pragma warning disable IDE0060 + + using System; using System.Collections.Generic; + using System.Linq; + using System.Reflection; using System.Reflection.Emit; + using API.Enums; using API.Features; using API.Features.Pools; - using Exiled.Events.EventArgs.Player; + using EventArgs.Player; + using Exiled.Events.Attributes; using HarmonyLib; + using Respawning; + using static HarmonyLib.AccessTools; /// - /// Patches for . + /// Patches for . /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Escaping))] [HarmonyPatch(typeof(Escape), nameof(Escape.ServerHandlePlayer))] internal static class Escaping { @@ -32,8 +43,35 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + LocalBuilder teamToGrantTickets = generator.DeclareLocal(typeof(SpawnableTeamType)); + LocalBuilder ticketsToGrant = generator.DeclareLocal(typeof(float)); + + newInstructions.InsertRange(0, new[] + { + new CodeInstruction(OpCodes.Ldc_I4_M1), + new (OpCodes.Stloc_S, teamToGrantTickets.LocalIndex), + new CodeInstruction(OpCodes.Ldc_I4_M1), + new (OpCodes.Stloc_S, teamToGrantTickets.LocalIndex), + }); + + // prevent calling RespawnTokensManager.GrantTokens, but save the values + for (int i = newInstructions.Count - 1; i >= 0; --i) + { + CodeInstruction instruction = newInstructions[i]; + if (instruction.opcode != OpCodes.Call || + instruction.operand is not MethodBase { Name: nameof(RespawnTokensManager.GrantTokens) }) + continue; + + newInstructions.RemoveAt(i); + newInstructions.InsertRange(i, new[] + { + new CodeInstruction(OpCodes.Stloc, ticketsToGrant.LocalIndex), + new (OpCodes.Stloc, teamToGrantTickets.LocalIndex), + }); + } + + int offset = -2; + int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, @@ -46,8 +84,17 @@ private static IEnumerable Transpiler(IEnumerable cctor.GetParameters().Any(param => param.ParameterType == typeof(SpawnableTeamType)))), new(OpCodes.Dup), new(OpCodes.Dup), new(OpCodes.Stloc, ev.LocalIndex), @@ -64,6 +111,10 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } + + private static void GrantAllTickets(EscapingEventArgs ev) + { + if (Enum.IsDefined(typeof(SpawnableTeamType), ev.RespawnTickets.Key) && ev.RespawnTickets.Key != SpawnableTeamType.None) + RespawnTokensManager.ModifyTokens(ev.RespawnTickets.Key, ev.RespawnTickets.Value); + } + } + + /// + /// Patches for . + /// Replaces last returned to . + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Escaping))] + [HarmonyPatch(typeof(Escape), nameof(Escape.ServerGetScenario))] + internal static class GetScenario + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + int e = 0; + for (int i = 0; i < newInstructions.Count; i++) + { + CodeInstruction codeInstruction = newInstructions[i]; + if (codeInstruction.opcode == OpCodes.Ldc_I4_0) + { + e++; + if (e > 3) + { + newInstructions[i].opcode = OpCodes.Ldc_I4_5; + } + } + } + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/EscapingPocketDimension.cs b/Exiled.Events/Patches/Events/Player/EscapingPocketDimension.cs index 42427d1713..b1db281b4d 100644 --- a/Exiled.Events/Patches/Events/Player/EscapingPocketDimension.cs +++ b/Exiled.Events/Patches/Events/Player/EscapingPocketDimension.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -27,6 +28,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches the method. /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.EscapingPocketDimension))] [HarmonyPatch(typeof(PocketDimensionTeleport), nameof(PocketDimensionTeleport.OnTriggerEnter))] internal static class EscapingPocketDimension { diff --git a/Exiled.Events/Patches/Events/Player/ExitingSinkholeEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/ExitingSinkholeEnvironmentalHazard.cs index cf9536f082..6c8099277d 100644 --- a/Exiled.Events/Patches/Events/Player/ExitingSinkholeEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/ExitingSinkholeEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,7 +24,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches with . /// Adds the event. /// - /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ExitingEnvironmentalHazard))] [HarmonyPatch(typeof(SinkholeEnvironmentalHazard), nameof(SinkholeEnvironmentalHazard.OnExit))] internal static class ExitingSinkholeEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/ExitingTantrumEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/ExitingTantrumEnvironmentalHazard.cs index e19d1cce95..d7d0e13af3 100644 --- a/Exiled.Events/Patches/Events/Player/ExitingTantrumEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/ExitingTantrumEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +24,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ExitingEnvironmentalHazard))] [HarmonyPatch(typeof(TantrumEnvironmentalHazard), nameof(TantrumEnvironmentalHazard.OnExit))] internal class ExitingTantrumEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/FailingEscapePocketDimension.cs b/Exiled.Events/Patches/Events/Player/FailingEscapePocketDimension.cs index f6d9657d93..f836e53d0b 100644 --- a/Exiled.Events/Patches/Events/Player/FailingEscapePocketDimension.cs +++ b/Exiled.Events/Patches/Events/Player/FailingEscapePocketDimension.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.FailingEscapePocketDimension))] [HarmonyPatch(typeof(PocketDimensionTeleport), nameof(PocketDimensionTeleport.OnTriggerEnter))] internal static class FailingEscapePocketDimension { @@ -39,31 +40,19 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(ReferenceHub), nameof(ReferenceHub.TryGetHubNetID)))) + offset; + int offset = -2; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, new[] { - // if (player is not Player player) - // return; new CodeInstruction(OpCodes.Ldloc_1).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), new(OpCodes.Dup), new(OpCodes.Stloc_S, player.LocalIndex), new(OpCodes.Brfalse, returnLabel), - }); - - // ----------- FailingEscapePocketDimension------------- - offset = 0; - index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Ldc_I4_S) + offset; - newInstructions.InsertRange( - index, - new[] - { // player new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex), diff --git a/Exiled.Events/Patches/Events/Player/FirearmRequestReceived.cs b/Exiled.Events/Patches/Events/Player/FirearmRequestReceived.cs index 6bc3a9dd41..464cda34ac 100644 --- a/Exiled.Events/Patches/Events/Player/FirearmRequestReceived.cs +++ b/Exiled.Events/Patches/Events/Player/FirearmRequestReceived.cs @@ -8,19 +8,22 @@ namespace Exiled.Events.Patches.Events.Player { using System.Collections.Generic; + using System.Reflection; using System.Reflection.Emit; using API.Features.Pools; + using Exiled.API.Features.Items; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Handlers; using HarmonyLib; + using InventorySystem.Items; using InventorySystem.Items.Firearms.BasicMessages; - - using PluginAPI.Enums; + using PluginAPI.Events; using static HarmonyLib.AccessTools; @@ -30,6 +33,11 @@ namespace Exiled.Events.Patches.Events.Player /// , and /// events. /// + [EventPatch(typeof(Player), nameof(Player.ReloadingWeapon))] + [EventPatch(typeof(Player), nameof(Player.UnloadingWeapon))] + [EventPatch(typeof(Player), nameof(Player.DryfiringWeapon))] + [EventPatch(typeof(Player), nameof(Player.AimingDownSight))] + [EventPatch(typeof(Player), nameof(Player.TogglingWeaponFlashlight))] [HarmonyPatch(typeof(FirearmBasicMessagesHandler), nameof(FirearmBasicMessagesHandler.ServerRequestReceived))] internal static class FirearmRequestReceived { @@ -39,26 +47,53 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S && (sbyte)instruction.operand == (sbyte)ServerEventType.PlayerReloadWeapon) + offset; + LocalBuilder firearm = generator.DeclareLocal(typeof(Firearm)); Label returnLabel = generator.DefineLabel(); - Label skipAdsLabel = generator.DefineLabel(); + + int offset = -1; + int index = newInstructions.FindLastIndex(instruction => instruction.LoadsField(Field(typeof(RequestMessage), nameof(RequestMessage.Request)))) + offset; + + newInstructions.InsertRange(index, new[] + { + // Player player = Player.Get(hub); + // if (player == null) + // return; + new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, player.LocalIndex), + new(OpCodes.Brfalse_S, returnLabel), + + // Firearm firearm = (Firearm)Item.Get(hub); + // if (Firearm == null) + // return; + new CodeInstruction(OpCodes.Ldloc_1), + new(OpCodes.Call, Method(typeof(API.Features.Items.Item), nameof(API.Features.Items.Item.Get), new[] { typeof(ItemBase) })), + new(OpCodes.Isinst, typeof(Firearm)), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, firearm.LocalIndex), + new(OpCodes.Brfalse_S, returnLabel), + }); + + offset = -2; + index = newInstructions.FindIndex( + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerReloadWeaponEvent))[0]) + offset; newInstructions.InsertRange( index, new[] { - // Player.Get(referenceHub) - new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), + // player + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).MoveLabelsFrom(newInstructions[index]), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // true new(OpCodes.Ldc_I4_1), - // ReloadingWeaponEventArgs ev = new(Player, bool) + // ReloadingWeaponEventArgs ev = new(Player, firearm, bool) new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ReloadingWeaponEventArgs))[0]), new(OpCodes.Dup), @@ -71,22 +106,24 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S && (sbyte)instruction.operand == (sbyte)ServerEventType.PlayerUnloadWeapon) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerUnloadWeaponEvent))[0]) + offset; newInstructions.InsertRange( index, new[] { - // Player.Get(referenceHub) - new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), + // player + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).MoveLabelsFrom(newInstructions[index]), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // true new(OpCodes.Ldc_I4_1), - // ReloadingWeaponEventArgs ev = new(Player, bool) + // UnloadingWeaponEventArgs ev = new(Player, firearm, bool) new(OpCodes.Newobj, GetDeclaredConstructors(typeof(UnloadingWeaponEventArgs))[0]), new(OpCodes.Dup), @@ -99,22 +136,24 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S && (sbyte)instruction.operand == (sbyte)ServerEventType.PlayerDryfireWeapon) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerDryfireWeaponEvent))[0]) + offset; newInstructions.InsertRange( index, new[] { - // Player.Get(referenceHub) - new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), + // player + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).MoveLabelsFrom(newInstructions[index]), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // true new(OpCodes.Ldc_I4_1), - // DryfiringWeaponEventArgs ev = new(Player, bool) + // DryfiringWeaponEventArgs ev = new(Player, firearm, bool) new(OpCodes.Newobj, GetDeclaredConstructors(typeof(DryfiringWeaponEventArgs))[0]), new(OpCodes.Dup), @@ -127,26 +166,19 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S && (sbyte)instruction.operand == (sbyte)ServerEventType.PlayerAimWeapon) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerAimWeaponEvent))[0]) + offset; newInstructions.InsertRange( index, new[] { - // Player player = Player.Get(referenceHub) - // - // if (player == null) - // goto skipAdsLabel; - new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), - new(OpCodes.Dup), - new(OpCodes.Stloc, player.LocalIndex), - new(OpCodes.Brfalse_S, skipAdsLabel), - // player - new(OpCodes.Ldloc, player.LocalIndex), + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).MoveLabelsFrom(newInstructions[index]), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // true (adsIn) new(OpCodes.Ldc_I4_1), @@ -154,27 +186,26 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S && (sbyte)instruction.operand == (sbyte)ServerEventType.PlayerAimWeapon) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerAimWeaponEvent))[0]) + offset; newInstructions.InsertRange( index, new[] { - // Player player = Player.Get(referenceHub) - new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), + // player + new CodeInstruction(OpCodes.Ldloc_S, player.LocalIndex).MoveLabelsFrom(newInstructions[index]), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // false (adsIn) new(OpCodes.Ldc_I4_0), @@ -182,7 +213,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable @@ -31,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.FlippingCoin))] [HarmonyPatch(typeof(Coin), nameof(Coin.ServerProcessCmd))] internal static class FlippingCoin { @@ -42,21 +38,21 @@ private static IEnumerable Transpiler(IEnumerable instruction.LoadsConstant(109)) + offset; - - offset = -1; - int replaceIndex = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(typeof(Random), nameof(Random.value)))) + offset; + int offset = -5; + int index = newInstructions.FindLastIndex(x => x.opcode == OpCodes.Brtrue_S) + offset; newInstructions.InsertRange( index, new[] { // Player.Get(ReferenceHub) - new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]).MoveLabelsFrom(newInstructions[replaceIndex]), + new CodeInstruction(OpCodes.Ldarg_0), new(OpCodes.Callvirt, PropertyGetter(typeof(ItemBase), nameof(ItemBase.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + // this + new CodeInstruction(OpCodes.Ldarg_0), + // isTails new(OpCodes.Ldloc_1), @@ -74,7 +70,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } } -} \ No newline at end of file +} diff --git a/Exiled.Events/Patches/Events/Player/Hurting.cs b/Exiled.Events/Patches/Events/Player/Hurting.cs index 7cedb944b1..3afc266e8f 100644 --- a/Exiled.Events/Patches/Events/Player/Hurting.cs +++ b/Exiled.Events/Patches/Events/Player/Hurting.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Pools; using API.Features.Roles; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; @@ -28,6 +29,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Hurting))] [HarmonyPatch(typeof(PlayerStats), nameof(PlayerStats.DealDamage))] internal static class Hurting { diff --git a/Exiled.Events/Patches/Events/Player/Interacted.cs b/Exiled.Events/Patches/Events/Player/Interacted.cs index b839061119..6a10abc85b 100644 --- a/Exiled.Events/Patches/Events/Player/Interacted.cs +++ b/Exiled.Events/Patches/Events/Player/Interacted.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -23,8 +23,9 @@ namespace Exiled.Events.Patches.Events.Player /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Interacted))] [HarmonyPatch(typeof(PlayerInteract), nameof(PlayerInteract.OnInteract))] internal static class Interacted { diff --git a/Exiled.Events/Patches/Events/Player/InteractingDoor.cs b/Exiled.Events/Patches/Events/Player/InteractingDoor.cs index 46b55e726d..8ab8d2c0fa 100644 --- a/Exiled.Events/Patches/Events/Player/InteractingDoor.cs +++ b/Exiled.Events/Patches/Events/Player/InteractingDoor.cs @@ -7,94 +7,118 @@ namespace Exiled.Events.Patches.Events.Player { -#pragma warning disable SA1313 -#pragma warning disable SA1005 -#pragma warning disable SA1515 -#pragma warning disable SA1513 -#pragma warning disable SA1512 - using System; + using System.Collections.Generic; + using System.Reflection.Emit; using API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; using Interactables.Interobjects.DoorUtils; - using PlayerRoles; - - using PluginAPI.Events; + using static HarmonyLib.AccessTools; /// /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.InteractingDoor))] [HarmonyPatch(typeof(DoorVariant), nameof(DoorVariant.ServerInteract), typeof(ReferenceHub), typeof(byte))] internal static class InteractingDoor { - private static bool Prefix(DoorVariant __instance, ReferenceHub ply, byte colliderId) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - try - { - InteractingDoorEventArgs ev = new(Player.Get(ply), __instance, false); + List newInstructions = ListPool.Pool.Get(instructions); + + LocalBuilder ev = generator.DeclareLocal(typeof(InteractingDoorEventArgs)); - bool bypassDenied = false; - bool allowInteracting = false; + List + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.InteractingLocker))] [HarmonyPatch(typeof(Locker), nameof(Locker.ServerInteract))] internal static class InteractingLocker { @@ -32,8 +32,8 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - const int offset = 0; - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Ldc_I4_S) + offset; + const int offset = -9; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, diff --git a/Exiled.Events/Patches/Events/Player/InteractingShootingTarget.cs b/Exiled.Events/Patches/Events/Player/InteractingShootingTarget.cs index 7a17aab455..a98188295f 100644 --- a/Exiled.Events/Patches/Events/Player/InteractingShootingTarget.cs +++ b/Exiled.Events/Patches/Events/Player/InteractingShootingTarget.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -29,6 +29,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.InteractingShootingTarget))] [HarmonyPatch(typeof(BaseTarget), nameof(BaseTarget.ServerInteract))] internal static class InteractingShootingTarget { diff --git a/Exiled.Events/Patches/Events/Player/IntercomSpeaking.cs b/Exiled.Events/Patches/Events/Player/IntercomSpeaking.cs index fa5c6deddf..8c2248195c 100644 --- a/Exiled.Events/Patches/Events/Player/IntercomSpeaking.cs +++ b/Exiled.Events/Patches/Events/Player/IntercomSpeaking.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -27,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.IntercomSpeaking))] [HarmonyPatch(typeof(Intercom), nameof(Intercom.Update))] internal static class IntercomSpeaking { diff --git a/Exiled.Events/Patches/Events/Player/IssuingMute.cs b/Exiled.Events/Patches/Events/Player/IssuingMute.cs index 54935b1ae2..c90fe93b9e 100644 --- a/Exiled.Events/Patches/Events/Player/IssuingMute.cs +++ b/Exiled.Events/Patches/Events/Player/IssuingMute.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.IssuingMute))] [HarmonyPatch(typeof(VoiceChatMutes), nameof(VoiceChatMutes.IssueLocalMute))] internal static class IssuingMute { diff --git a/Exiled.Events/Patches/Events/Player/ItemDrop.cs b/Exiled.Events/Patches/Events/Player/ItemDrop.cs index 0ead07d16e..838642b87a 100644 --- a/Exiled.Events/Patches/Events/Player/ItemDrop.cs +++ b/Exiled.Events/Patches/Events/Player/ItemDrop.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Handlers; @@ -25,10 +25,12 @@ namespace Exiled.Events.Patches.Events.Player using Item = API.Features.Items.Item; /// - /// Patches . + /// Patches . /// Adds the and events. /// - [HarmonyPatch(typeof(Inventory), nameof(Inventory.UserCode_CmdDropItem))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.DroppingItem))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.DroppingNothing))] + [HarmonyPatch(typeof(Inventory), nameof(Inventory.UserCode_CmdDropItem__UInt16__Boolean))] internal static class ItemDrop { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) diff --git a/Exiled.Events/Patches/Events/Player/Joined.cs b/Exiled.Events/Patches/Events/Player/Joined.cs index a32684218f..416a957350 100644 --- a/Exiled.Events/Patches/Events/Player/Joined.cs +++ b/Exiled.Events/Patches/Events/Player/Joined.cs @@ -8,20 +8,17 @@ namespace Exiled.Events.Patches.Events.Player { #pragma warning disable SA1600 +#pragma warning disable SA1313 // Parameter names should begin with lower-case letter using System; - using System.Collections.Generic; - using System.Reflection.Emit; using API.Features; - using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Loader.Features; using HarmonyLib; - using static HarmonyLib.AccessTools; - /// /// Patches . /// Adds the event. @@ -47,7 +44,7 @@ internal static void CallEvent(ReferenceHub hub, out Player player) } else { - Player.UnverifiedPlayers.Add(hub, player); + Player.UnverifiedPlayers.Add(hub.gameObject, player); Handlers.Player.OnJoined(new JoinedEventArgs(player)); } @@ -59,9 +56,7 @@ internal static void CallEvent(ReferenceHub hub, out Player player) } } -#pragma warning disable SA1313 // Parameter names should begin with lower-case letter private static void Postfix(ReferenceHub __instance) -#pragma warning restore SA1313 // Parameter names should begin with lower-case letter { if (ReferenceHub.AllHubs.Count - 1 >= CustomNetworkManager.slots) { diff --git a/Exiled.Events/Patches/Events/Player/Jumping.cs b/Exiled.Events/Patches/Events/Player/Jumping.cs index cfb8c52172..a373633d93 100644 --- a/Exiled.Events/Patches/Events/Player/Jumping.cs +++ b/Exiled.Events/Patches/Events/Player/Jumping.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Events.Handlers; @@ -24,9 +24,10 @@ namespace Exiled.Events.Patches.Events.Player using static HarmonyLib.AccessTools; /// - /// Patches + /// Patches /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.Jumping))] [HarmonyPatch(typeof(FpcMotor), nameof(FpcMotor.UpdateGrounded))] internal static class Jumping { @@ -35,7 +36,6 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); LocalBuilder ev = generator.DeclareLocal(typeof(JumpingEventArgs)); - LocalBuilder direction = generator.DeclareLocal(typeof(Vector3)); Label ret = generator.DefineLabel(); @@ -52,8 +52,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable. /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Kicked))] [HarmonyPatch(typeof(ServerConsole), nameof(ServerConsole.Disconnect), typeof(GameObject), typeof(string))] internal static class Kicked { diff --git a/Exiled.Events/Patches/Events/Player/Kicking.cs b/Exiled.Events/Patches/Events/Player/Kicking.cs index e5cf602155..156dee9562 100644 --- a/Exiled.Events/Patches/Events/Player/Kicking.cs +++ b/Exiled.Events/Patches/Events/Player/Kicking.cs @@ -13,12 +13,10 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using CommandSystem; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; - - using PluginAPI.Enums; using PluginAPI.Events; using Log = API.Features.Log; @@ -27,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Kicking))] [HarmonyPatch(typeof(BanPlayer), nameof(BanPlayer.KickUser), typeof(ReferenceHub), typeof(ICommandSender), typeof(string))] internal static class Kicking { @@ -49,12 +48,7 @@ private static bool Prefix(ReferenceHub target, ICommandSender issuer, string re reason = ev.Reason; message = ev.FullMessage; - if (!EventManager.ExecuteEvent(ServerEventType.PlayerKicked, new object[] - { - target, - issuer, - reason, - })) + if (!EventManager.ExecuteEvent(new PlayerKickedEvent(target, issuer, reason))) { __result = false; return false; diff --git a/Exiled.Events/Patches/Events/Player/Landing.cs b/Exiled.Events/Patches/Events/Player/Landing.cs index e5efc39e33..21b3b06622 100644 --- a/Exiled.Events/Patches/Events/Player/Landing.cs +++ b/Exiled.Events/Patches/Events/Player/Landing.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Events.Handlers; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.Landing))] [HarmonyPatch(typeof(AnimatedCharacterModel), nameof(AnimatedCharacterModel.OnGrounded))] internal static class Landing { diff --git a/Exiled.Events/Patches/Events/Player/Left.cs b/Exiled.Events/Patches/Events/Player/Left.cs index ba05079554..1453bbb140 100644 --- a/Exiled.Events/Patches/Events/Player/Left.cs +++ b/Exiled.Events/Patches/Events/Player/Left.cs @@ -13,6 +13,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -22,10 +23,10 @@ namespace Exiled.Events.Patches.Events.Player using static HarmonyLib.AccessTools; /// - /// Patches . + /// Patches . /// Adds the event. /// - [HarmonyPatch(typeof(CustomNetworkManager), nameof(CustomNetworkManager.OnServerDisconnect), typeof(NetworkConnection))] + [HarmonyPatch(typeof(CustomNetworkManager), nameof(CustomNetworkManager.OnServerDisconnect), typeof(NetworkConnectionToClient))] internal static class Left { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) diff --git a/Exiled.Events/Patches/Events/Player/MakingNoise.cs b/Exiled.Events/Patches/Events/Player/MakingNoise.cs new file mode 100644 index 0000000000..eb525afa58 --- /dev/null +++ b/Exiled.Events/Patches/Events/Player/MakingNoise.cs @@ -0,0 +1,84 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Player +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Player; + using HarmonyLib; + using PlayerRoles.FirstPersonControl.Thirdperson; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add event. + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.MakingNoise))] + [HarmonyPatch(typeof(AnimatedCharacterModel), nameof(AnimatedCharacterModel.PlayFootstep))] + internal class MakingNoise + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label continueLabel = generator.DefineLabel(); + + LocalBuilder ev = generator.DeclareLocal(typeof(MakingNoiseEventArgs)); + + int offset = -1; + int index = newInstructions.FindIndex(x => x.Is(OpCodes.Callvirt, PropertyGetter(typeof(PlayerEffectsController), nameof(PlayerEffectsController.AllEffects)))) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // Player player = Player.Get(thus.OwnerHub); + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(AnimatedCharacterModel), nameof(AnimatedCharacterModel.OwnerHub))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // this + new(OpCodes.Ldloc_0), + + // true + new(OpCodes.Ldc_I4_1), + + // MakingNoiseEventArgs ev = new(player, this, true); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(MakingNoiseEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev.LocalIndex), + + // Handlers.Player.OnMakingNoise(ev); + new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnMakingNoise))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(MakingNoiseEventArgs), nameof(MakingNoiseEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + new(OpCodes.Ret), + + // distance = ev.Distance; + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex).WithLabels(continueLabel), + new(OpCodes.Callvirt, PropertyGetter(typeof(MakingNoiseEventArgs), nameof(MakingNoiseEventArgs.Distance))), + new(OpCodes.Stloc_0), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/PickingUp330.cs b/Exiled.Events/Patches/Events/Player/PickingUp330.cs index bffad7bc1d..c6be7d7bf5 100644 --- a/Exiled.Events/Patches/Events/Player/PickingUp330.cs +++ b/Exiled.Events/Patches/Events/Player/PickingUp330.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches the method to add the /// event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.PickingUpItem))] [HarmonyPatch(typeof(Scp330Bag), nameof(Scp330Bag.ServerProcessPickup))] internal static class PickingUp330 { diff --git a/Exiled.Events/Patches/Events/Player/PickingUpAmmo.cs b/Exiled.Events/Patches/Events/Player/PickingUpAmmo.cs index 249d89890b..4b821fc4b0 100644 --- a/Exiled.Events/Patches/Events/Player/PickingUpAmmo.cs +++ b/Exiled.Events/Patches/Events/Player/PickingUpAmmo.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +24,7 @@ namespace Exiled.Events.Patches.Events.Player /// /// Patches for the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.PickingUpItem))] [HarmonyPatch(typeof(AmmoSearchCompletor), nameof(AmmoSearchCompletor.Complete))] internal static class PickingUpAmmo { diff --git a/Exiled.Events/Patches/Events/Player/PickingUpArmor.cs b/Exiled.Events/Patches/Events/Player/PickingUpArmor.cs index d65a72fec4..85e395ec8a 100644 --- a/Exiled.Events/Patches/Events/Player/PickingUpArmor.cs +++ b/Exiled.Events/Patches/Events/Player/PickingUpArmor.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches the method to add the /// event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.PickingUpItem))] [HarmonyPatch(typeof(ArmorSearchCompletor), nameof(ArmorSearchCompletor.Complete))] internal static class PickingUpArmor { diff --git a/Exiled.Events/Patches/Events/Player/PickingUpItem.cs b/Exiled.Events/Patches/Events/Player/PickingUpItem.cs index 09a9200a98..879cc3196c 100644 --- a/Exiled.Events/Patches/Events/Player/PickingUpItem.cs +++ b/Exiled.Events/Patches/Events/Player/PickingUpItem.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.PickingUpItem))] [HarmonyPatch(typeof(ItemSearchCompletor), nameof(ItemSearchCompletor.Complete))] internal static class PickingUpItem { @@ -36,6 +37,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable /// Patches to add missing event handler to the - /// . + /// . /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.PickingUpItem))] [HarmonyPatch(typeof(Scp244SearchCompletor), nameof(Scp244SearchCompletor.Complete))] internal static class PickingUpScp244 { diff --git a/Exiled.Events/Patches/Events/Player/ProcessDisarmMessage.cs b/Exiled.Events/Patches/Events/Player/ProcessDisarmMessage.cs index cb1acec89c..4c0414ec38 100644 --- a/Exiled.Events/Patches/Events/Player/ProcessDisarmMessage.cs +++ b/Exiled.Events/Patches/Events/Player/ProcessDisarmMessage.cs @@ -8,35 +8,39 @@ namespace Exiled.Events.Patches.Events.Player { using System.Collections.Generic; + using System.Reflection; using System.Reflection.Emit; using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; using InventorySystem.Disarming; + using PluginAPI.Events; + using static HarmonyLib.AccessTools; /// /// Patches . /// Adds the and events. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Handcuffing))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RemovingHandcuffs))] [HarmonyPatch(typeof(DisarmingHandlers), nameof(DisarmingHandlers.ServerProcessDisarmMessage))] internal static class ProcessDisarmMessage { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - Label returnLabel = generator.DefineLabel(); - int offset = -4; + int offset = -3; int index = newInstructions.FindIndex( - instruction => instruction.Calls(Method(typeof(DisarmedPlayers), nameof(DisarmedPlayers.SetDisarmedStatus)))) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerRemoveHandcuffsEvent))[0]) + offset; newInstructions.InsertRange( index, @@ -67,9 +71,9 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(DisarmedPlayers), nameof(DisarmedPlayers.SetDisarmedStatus)))) + offset; + instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerHandcuffEvent))[0]) + offset; newInstructions.InsertRange( index, diff --git a/Exiled.Events/Patches/Events/Player/ProcessingHotkey.cs b/Exiled.Events/Patches/Events/Player/ProcessingHotkey.cs deleted file mode 100644 index 04b5713acf..0000000000 --- a/Exiled.Events/Patches/Events/Player/ProcessingHotkey.cs +++ /dev/null @@ -1,168 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Player -{ - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features; - using API.Features.Pools; - - using Exiled.Events.EventArgs.Player; - - using HarmonyLib; - - using InventorySystem; - - using static HarmonyLib.AccessTools; - - /// - /// Patch the . - /// Adds the event. - /// - [HarmonyPatch(typeof(Inventory), nameof(Inventory.UserCode_CmdProcessHotkey))] - internal static class ProcessingHotkey - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - Label returnLabel = generator.DefineLabel(); - Label defaultLabel = generator.DefineLabel(); - Label breakLabel = generator.DefineLabel(); - - Label[] switchLabels = - { - generator.DefineLabel(), - generator.DefineLabel(), - generator.DefineLabel(), - generator.DefineLabel(), - }; - - LocalBuilder hotkeyButton = generator.DeclareLocal(typeof(byte)); - - newInstructions.InsertRange( - 0, - new[] - { - // if (hotkeyButtonPressed != ActionName.HotkeyKeycard) - // goto switchLabels[0]; - new(OpCodes.Ldarg_1), - new(OpCodes.Ldc_I4_S, 20), - new(OpCodes.Ceq), - new(OpCodes.Brfalse_S, switchLabels[0]), - - // hotkeyButton = 0 - // break - new(OpCodes.Ldc_I4_0), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // switchLabels[0]: - // - // if (hotKeyButtonPressed != ActionName.HotkeyPrimaryFirearm) - // goto switchLabels[1]; - new CodeInstruction(OpCodes.Ldarg_1).WithLabels(switchLabels[0]), - new(OpCodes.Ldc_I4_S, 24), - new(OpCodes.Ceq), - new(OpCodes.Brfalse_S, switchLabels[1]), - - // hotkeyButton = 1 - // break - new(OpCodes.Ldc_I4_1), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // switchLabels[1]: - // - // if (hotKeyButtonPressed != ActionName.HotkeySecondaryFirearm) - // goto switchLabels[2]; - new CodeInstruction(OpCodes.Ldarg_1).WithLabels(switchLabels[1]), - new(OpCodes.Ldc_I4_S, 25), - new(OpCodes.Ceq), - new(OpCodes.Brfalse_S, switchLabels[2]), - - // hotkeyButton = 2 - // break - new(OpCodes.Ldc_I4_2), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // switchLabels[2]: - // - // if (hotKeyButtonPressed != ActionName.HotkeyMedical) - // goto switchLabels[3]; - new CodeInstruction(OpCodes.Ldarg_1).WithLabels(switchLabels[2]), - new(OpCodes.Ldc_I4_S, 26), - new(OpCodes.Ceq), - new(OpCodes.Brfalse_S, switchLabels[3]), - - // hotkeyButton = 3 - // break - new(OpCodes.Ldc_I4_3), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // switchLabels[3]: - // - // if (hotKeyButtonPressed != ActionName.HotkeyGrenade) - // goto defaultLabel; - new CodeInstruction(OpCodes.Ldarg_1).WithLabels(switchLabels[3]), - new(OpCodes.Ldc_I4_S, 29), - new(OpCodes.Ceq), - new(OpCodes.Brfalse_S, defaultLabel), - - // hotkeyButton = 4 - // break - new(OpCodes.Ldc_I4_4), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // defaultLabel: - // - // hotkeyButton = 0 - // break - new CodeInstruction(OpCodes.Ldc_I4_0).WithLabels(defaultLabel), - new(OpCodes.Stloc_S, hotkeyButton.LocalIndex), - new(OpCodes.Br_S, breakLabel), - - // breakLabel: - // - // Player.Get(this._hub) - new CodeInstruction(OpCodes.Ldarg_0).WithLabels(breakLabel), - new(OpCodes.Ldfld, Field(typeof(Inventory), nameof(Inventory._hub))), - new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - - // hotkeyButton - new(OpCodes.Ldloc_S, hotkeyButton.LocalIndex), - - // true - new(OpCodes.Ldc_I4_1), - - // ProcessingHotkeyEventArgs ev = new(Player, HotkeyButton, bool) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ProcessingHotkeyEventArgs))[0]), - new(OpCodes.Dup), - - // Handlers.Player.OnProcessingHotkey(ev) - new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnProcessingHotkey))), - - // if (!ev.IsAllowed) - // return; - new(OpCodes.Callvirt, PropertyGetter(typeof(ProcessingHotkeyEventArgs), nameof(ProcessingHotkeyEventArgs.IsAllowed))), - new(OpCodes.Brfalse_S, returnLabel), - }); - - newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/ReceivingStatusEffect.cs b/Exiled.Events/Patches/Events/Player/ReceivingStatusEffect.cs index 2d13dbe137..3689272e8d 100644 --- a/Exiled.Events/Patches/Events/Player/ReceivingStatusEffect.cs +++ b/Exiled.Events/Patches/Events/Player/ReceivingStatusEffect.cs @@ -14,7 +14,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Pools; using CustomPlayerEffects; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,7 +25,8 @@ namespace Exiled.Events.Patches.Events.Player /// Patches the method. /// Adds the event. /// - [HarmonyPatch(typeof(StatusEffectBase), nameof(StatusEffectBase.Intensity), MethodType.Setter)] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ReceivingEffect))] + [HarmonyPatch(typeof(StatusEffectBase), nameof(StatusEffectBase.ForceIntensity))] internal static class ReceivingStatusEffect { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) diff --git a/Exiled.Events/Patches/Events/Player/ReservedSlotPatch.cs b/Exiled.Events/Patches/Events/Player/ReservedSlotPatch.cs index 3e432201d4..f5905d0e6a 100644 --- a/Exiled.Events/Patches/Events/Player/ReservedSlotPatch.cs +++ b/Exiled.Events/Patches/Events/Player/ReservedSlotPatch.cs @@ -11,15 +11,12 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - - using Exiled.API.Enums; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Handlers; using HarmonyLib; - - using PluginAPI.Enums; using PluginAPI.Events; using static HarmonyLib.AccessTools; @@ -28,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.ReservedSlot))] [HarmonyPatch(typeof(ReservedSlot), nameof(ReservedSlot.HasReservedSlot))] internal static class ReservedSlotPatch { @@ -40,8 +38,8 @@ private static IEnumerable Transpiler(IEnumerable i.opcode == OpCodes.Ldc_I4_S) + offset; + int offset = -2; + int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Newobj) + offset; newInstructions[index].WithLabels(baseGame); @@ -108,7 +106,7 @@ private static IEnumerable Transpiler(IEnumerable(ServerEventType.PlayerCheckReservedSlot, userId, hasReservedSlot); + EventManager.ExecuteEvent(new PlayerCheckReservedSlotEvent(userId, hasReservedSlot)); } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/RevokingMute.cs b/Exiled.Events/Patches/Events/Player/RevokingMute.cs index 19ffe6598d..11ff0183bf 100644 --- a/Exiled.Events/Patches/Events/Player/RevokingMute.cs +++ b/Exiled.Events/Patches/Events/Player/RevokingMute.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patch the . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RevokingMute))] [HarmonyPatch(typeof(VoiceChatMutes), nameof(VoiceChatMutes.RevokeLocalMute))] internal static class RevokingMute { diff --git a/Exiled.Events/Patches/Events/Player/SearchingPickupEvent.cs b/Exiled.Events/Patches/Events/Player/SearchingPickupEvent.cs index 12d2ca7dea..a20a1d7419 100644 --- a/Exiled.Events/Patches/Events/Player/SearchingPickupEvent.cs +++ b/Exiled.Events/Patches/Events/Player/SearchingPickupEvent.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.SearchingPickup))] [HarmonyPatch(typeof(SearchCoordinator), nameof(SearchCoordinator.ReceiveRequestUnsafe))] internal static class SearchingPickupEvent { diff --git a/Exiled.Events/Patches/Events/Player/Shooting.cs b/Exiled.Events/Patches/Events/Player/Shooting.cs index b33c1d4829..ef2bfab3c8 100644 --- a/Exiled.Events/Patches/Events/Player/Shooting.cs +++ b/Exiled.Events/Patches/Events/Player/Shooting.cs @@ -14,10 +14,14 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Items; using API.Features.Pools; + using CustomPlayerEffects; + + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; + using InventorySystem.Items; using InventorySystem.Items.Firearms.BasicMessages; using static HarmonyLib.AccessTools; @@ -26,6 +30,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the events. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Shooting))] [HarmonyPatch(typeof(FirearmBasicMessagesHandler), nameof(FirearmBasicMessagesHandler.ServerShotReceived))] internal static class Shooting { @@ -33,32 +38,51 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - Label returnLabelModAmmo = generator.DefineLabel(); Label isAllowedLabel = generator.DefineLabel(); Label returnLabel = generator.DefineLabel(); LocalBuilder ev = generator.DeclareLocal(typeof(ShootingEventArgs)); - LocalBuilder isAllowed = generator.DeclareLocal(typeof(bool)); LocalBuilder firearm = generator.DeclareLocal(typeof(Item)); + LocalBuilder player = generator.DeclareLocal(typeof(Player)); - int offset = 2; - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Pop) + offset; + int offset = -1; + int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(SpawnProtected), nameof(SpawnProtected.CheckPlayer)))) + offset; newInstructions.InsertRange( index, new[] { - // Pop ldloc.1 in the stack - new(OpCodes.Pop), - // Player.Get(referenceHub) - new(OpCodes.Ldloc_0), + new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, player.LocalIndex), + + // if (player == null) + // return; + new(OpCodes.Brfalse_S, returnLabel), + + // firearm = (Firearm)Item.Get(curInstance) + new(OpCodes.Ldloc_1), + new(OpCodes.Call, Method(typeof(Item), nameof(Item.Get), new[] { typeof(ItemBase) })), + new(OpCodes.Isinst, typeof(Firearm)), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, firearm.LocalIndex), + + // if (firearm == null) + // return; + new(OpCodes.Brfalse_S, returnLabel), + + // player + new(OpCodes.Ldloc_S, player.LocalIndex), + + // firearm + new(OpCodes.Ldloc_S, firearm.LocalIndex), // msg new(OpCodes.Ldarg_1), - // ShootingEventArgs ev = new(Player, ShotMessage) + // ShootingEventArgs ev = new(Player, firearm, ShotMessage) new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ShootingEventArgs))[0]), new(OpCodes.Dup), new(OpCodes.Dup), @@ -67,58 +91,26 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the and events. + /// Adds the events. /// - [HarmonyPatch] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Shot))] + [HarmonyPatch(typeof(SingleBulletHitreg), nameof(SingleBulletHitreg.ServerProcessRaycastHit))] internal static class Shot { - [HarmonyPatch(typeof(SingleBulletHitreg), nameof(SingleBulletHitreg.ServerProcessRaycastHit))] - [HarmonyTranspiler] - private static IEnumerable ShotBullet(IEnumerable instructions, ILGenerator generator) + /// + /// I DON'T CARE. + /// + /// Fuck Player. + /// Fuck Hit. + /// FuckDestructible. + /// FuckDamage. + /// FuckReturn. + internal static bool ProcessShot(ReferenceHub player, RaycastHit hit, IDestructible destructible, ref float damage) + { + ShotEventArgs shotEvent = new(Player.Get(player), hit, destructible, damage); + + Handlers.Player.OnShot(shotEvent); + + if (shotEvent.CanHurt) + damage = shotEvent.Damage; + + return shotEvent.CanHurt; + } + + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); Label returnLabel = generator.DefineLabel(); + Label jump = generator.DefineLabel(); LocalBuilder ev = generator.DeclareLocal(typeof(ShotEventArgs)); - const int offset = 2; + int offset = 2; int index = newInstructions.FindLastIndex( instruction => instruction.Calls(Method(typeof(FirearmBaseStats), nameof(FirearmBaseStats.DamageAtDistance)))) + offset; @@ -49,7 +71,7 @@ private static IEnumerable ShotBullet(IEnumerable ShotBullet(IEnumerable instruction.Calls(Method(typeof(StandardHitregBase), nameof(StandardHitregBase.PlaceBulletholeDecal)))) + offset; + + // replace the original goto label + newInstructions.FindAll(instruction => instruction.opcode == OpCodes.Brfalse).ForEach(instruction => instruction.operand = jump); + + newInstructions.InsertRange( + index, + new CodeInstruction[] + { + new CodeInstruction(OpCodes.Nop).WithLabels(jump), + + // this.Hub + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(StandardHitregBase), nameof(StandardHitregBase.Hub))), + + // hit + new(OpCodes.Ldarg_2), + + // destructible + new(OpCodes.Ldnull), + + // damage + new(OpCodes.Ldc_R4, 0f), + new(OpCodes.Stloc_S, 1), + new(OpCodes.Ldloca_S, 1), + + // Shot.ProcessShot + new(OpCodes.Call, Method(typeof(Shot), nameof(ProcessShot), new[] { typeof(ReferenceHub), typeof(RaycastHit), typeof(IDestructible), typeof(float).MakeByRefType(), })), + new(OpCodes.Pop), + }); + newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); for (int z = 0; z < newInstructions.Count; z++) @@ -76,21 +131,53 @@ private static IEnumerable ShotBullet(IEnumerable.Pool.Return(newInstructions); } + } - /// - /// Patches . - /// Adds the and events. - /// - [HarmonyPatch(typeof(BuckshotHitreg), nameof(BuckshotHitreg.ShootPellet))] - [HarmonyTranspiler] - private static IEnumerable ShotPellet(IEnumerable instructions, ILGenerator generator) + /// + /// Patches . + /// Adds the events. + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Shot))] + [HarmonyPatch(typeof(BuckshotHitreg), nameof(BuckshotHitreg.ShootPellet))] + internal static class Shot2 + { + private static IEnumerable Transpiller(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); Label returnLabel = generator.DefineLabel(); - const int offset = 0; - int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldsfld) + offset; + int offset = -3; + int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(StandardHitregBase), nameof(StandardHitregBase.PlaceBulletholeDecal)))) + offset; + + newInstructions.InsertRange( + index, + new CodeInstruction[] + { + // this.Hub + new CodeInstruction(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(BuckshotHitreg), nameof(BuckshotHitreg.Hub))), + + // hit + new(OpCodes.Ldloc_2), + + // destructible + new(OpCodes.Ldloc_3), + + // damage + new(OpCodes.Ldc_R4, 0f), + new(OpCodes.Stloc_S, 4), + new(OpCodes.Ldloca_S, 4), + + new(OpCodes.Call, Method(typeof(Shot), nameof(Shot.ProcessShot), new[] { typeof(ReferenceHub), typeof(RaycastHit), typeof(IDestructible), typeof(float).MakeByRefType(), })), + + // if (!ev.CanHurt) + // return; + new(OpCodes.Brfalse_S, returnLabel), + }); + + offset = 0; + index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldsfld) + offset; newInstructions.InsertRange( index, @@ -109,7 +196,7 @@ private static IEnumerable ShotPellet(IEnumerable ShotPellet(IEnumerable.Pool.Return(newInstructions); } - - private static bool ProcessShot(ReferenceHub player, RaycastHit hit, IDestructible destructible, ref float damage) - { - ShotEventArgs shotEvent = new ShotEventArgs(Player.Get(player), hit, destructible, damage); - - Handlers.Player.OnShot(shotEvent); - - if (shotEvent.CanHurt) - damage = shotEvent.Damage; - - return shotEvent.CanHurt; - } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/Spawning.cs b/Exiled.Events/Patches/Events/Player/Spawning.cs index a6dac552eb..520d8e97b0 100644 --- a/Exiled.Events/Patches/Events/Player/Spawning.cs +++ b/Exiled.Events/Patches/Events/Player/Spawning.cs @@ -7,23 +7,17 @@ namespace Exiled.Events.Patches.Events.Player { - using System.Collections.Generic; using System.Reflection; - using System.Reflection.Emit; using API.Features; - using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; - using Mirror; using PlayerRoles; using PlayerRoles.FirstPersonControl; using PlayerRoles.FirstPersonControl.Spawnpoints; - using PlayerRoles.PlayableScps.Scp049; - using PlayerRoles.PlayableScps.Subroutines; using UnityEngine; @@ -33,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches delegate. /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Spawning))] [HarmonyPatch] internal static class Spawning { diff --git a/Exiled.Events/Patches/Events/Player/SpawningRagdoll.cs b/Exiled.Events/Patches/Events/Player/SpawningRagdoll.cs index 767dd16219..0db340ee94 100644 --- a/Exiled.Events/Patches/Events/Player/SpawningRagdoll.cs +++ b/Exiled.Events/Patches/Events/Player/SpawningRagdoll.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Handlers; @@ -30,6 +30,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Player), nameof(Player.SpawningRagdoll))] [HarmonyPatch(typeof(RagdollManager), nameof(RagdollManager.ServerSpawnRagdoll))] internal static class SpawningRagdoll { diff --git a/Exiled.Events/Patches/Events/Player/StayingOnEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/StayingOnEnvironmentalHazard.cs index 14542489e4..93cf67e745 100644 --- a/Exiled.Events/Patches/Events/Player/StayingOnEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/StayingOnEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.StayingOnEnvironmentalHazard))] [HarmonyPatch(typeof(EnvironmentalHazard), nameof(EnvironmentalHazard.OnStay))] internal static class StayingOnEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/StayingOnSinkholeEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/StayingOnSinkholeEnvironmentalHazard.cs index 02a0cb0ded..5121f9ed2f 100644 --- a/Exiled.Events/Patches/Events/Player/StayingOnSinkholeEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/StayingOnSinkholeEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using HarmonyLib; using Hazards; @@ -20,7 +20,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . ///
Adds the event.
///
- /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.StayingOnEnvironmentalHazard))] [HarmonyPatch(typeof(SinkholeEnvironmentalHazard), nameof(SinkholeEnvironmentalHazard.OnStay))] internal static class StayingOnSinkholeEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/StayingOnTantrumEnvironmentalHazard.cs b/Exiled.Events/Patches/Events/Player/StayingOnTantrumEnvironmentalHazard.cs index 81a780ee4e..a4a85368df 100644 --- a/Exiled.Events/Patches/Events/Player/StayingOnTantrumEnvironmentalHazard.cs +++ b/Exiled.Events/Patches/Events/Player/StayingOnTantrumEnvironmentalHazard.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using HarmonyLib; using Hazards; @@ -20,6 +20,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . ///
Adds the event.
///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.StayingOnEnvironmentalHazard))] [HarmonyPatch(typeof(TantrumEnvironmentalHazard), nameof(TantrumEnvironmentalHazard.OnStay))] internal static class StayingOnTantrumEnvironmentalHazard { diff --git a/Exiled.Events/Patches/Events/Player/ThrowingRequest.cs b/Exiled.Events/Patches/Events/Player/ThrowingRequest.cs index a0e72318f3..90afa8d723 100644 --- a/Exiled.Events/Patches/Events/Player/ThrowingRequest.cs +++ b/Exiled.Events/Patches/Events/Player/ThrowingRequest.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ThrowingRequest))] [HarmonyPatch(typeof(ThrowableNetworkHandler), nameof(ThrowableNetworkHandler.ServerProcessRequest))] internal static class ThrowingRequest { @@ -31,9 +33,9 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - int offset = 4; + int offset = 5; - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Dup) + offset; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Isinst) + offset; Label returnLabel = generator.DefineLabel(); @@ -56,22 +58,14 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ThrownProjectile))] [HarmonyPatch(typeof(ThrowableItem), nameof(ThrowableItem.ServerThrow))] internal static class ThrownProjectile { @@ -37,11 +38,14 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(NetworkServer), nameof(NetworkServer.Spawn), new[] { typeof(GameObject), typeof(NetworkConnection) }))) + offset; newInstructions.InsertRange(index, new[] { + // thrownProjectile + new(OpCodes.Dup), + // API.Features.Player.Get(this.Owner) new CodeInstruction(OpCodes.Ldarg_0), new(OpCodes.Callvirt, PropertyGetter(typeof(ThrowableItem), nameof(ThrowableItem.Owner))), @@ -50,13 +54,10 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event. + /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.TogglingFlashlight))] [HarmonyPatch(typeof(FlashlightNetworkHandler), nameof(FlashlightNetworkHandler.ServerProcessMessage))] internal static class TogglingFlashlight { @@ -34,8 +34,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + int offset = -8; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; newInstructions.InsertRange( index, @@ -51,7 +51,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldfld) + offset; - - // Remove msg.NewState to inject or logic - newInstructions.RemoveRange(index, 2); + // Remove all msg.NewState to inject or logic + for (int i = 0; i < 2; i++) + { + offset = -1; + index = newInstructions.FindLastIndex(i => i.LoadsField(Field(typeof(FlashlightNetworkHandler.FlashlightMessage), nameof(FlashlightNetworkHandler.FlashlightMessage.NewState)))) + offset; - offset = -4; - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldfld) + offset; - - // Inject our logic - newInstructions.InsertRange( - index, - new CodeInstruction[] - { - // ev.NewState - new(OpCodes.Ldloc_S, ev.LocalIndex), - new(OpCodes.Callvirt, PropertyGetter(typeof(TogglingFlashlightEventArgs), nameof(TogglingFlashlightEventArgs.NewState))), - }); - - offset = -1; - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldfld) + offset; - - // Remove msg.NewState to inject or logic - newInstructions.RemoveRange(index, 2); - - index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Newobj); - - // Inject our logic - newInstructions.InsertRange( - index, - new CodeInstruction[] + newInstructions.RemoveRange(index, 2); + newInstructions.InsertRange(index, new CodeInstruction[] { - // ev.NewState new(OpCodes.Ldloc_S, ev.LocalIndex), new(OpCodes.Callvirt, PropertyGetter(typeof(TogglingFlashlightEventArgs), nameof(TogglingFlashlightEventArgs.NewState))), }); + } for (int z = 0; z < newInstructions.Count; z++) yield return newInstructions[z]; diff --git a/Exiled.Events/Patches/Events/Player/TogglingNoClip.cs b/Exiled.Events/Patches/Events/Player/TogglingNoClip.cs index 57a0c71d62..b541a3dd71 100644 --- a/Exiled.Events/Patches/Events/Player/TogglingNoClip.cs +++ b/Exiled.Events/Patches/Events/Player/TogglingNoClip.cs @@ -12,11 +12,15 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + + using Exiled.API.Features.Roles; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; using PlayerRoles.FirstPersonControl; + using PlayerRoles.FirstPersonControl.NetworkMessages; using static HarmonyLib.AccessTools; @@ -24,7 +28,8 @@ namespace Exiled.Events.Patches.Events.Player /// patches to add the /// event. ///
- [HarmonyPatch(typeof(FpcNoclip), nameof(FpcNoclip.IsActive), MethodType.Setter)] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.TogglingNoClip))] + [HarmonyPatch(typeof(FpcNoclipToggleMessage), nameof(FpcNoclipToggleMessage.ProcessMessage))] internal static class TogglingNoClip { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) @@ -32,31 +37,38 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); Label retLabel = generator.DefineLabel(); - LocalBuilder ev = generator.DeclareLocal(typeof(TogglingNoClipEventArgs)); + int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ldloc_0); + + Label checkLabel = newInstructions[index].ExtractLabels()[0]; + + // Remove the base-game FpcNoclip.IsPermitted(hub) call, as we will be using that for our default value for ev.IsAllowed + newInstructions.RemoveRange(index, 4); + newInstructions.InsertRange( - 0, - new CodeInstruction[] + index, + new[] { - // Player.Get(this._hub) - new(OpCodes.Ldarg_0), - new(OpCodes.Ldfld, Field(typeof(FpcNoclip), nameof(FpcNoclip._hub))), + // Player.Get(hub) + new CodeInstruction(OpCodes.Ldloc_0).WithLabels(checkLabel), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + new(OpCodes.Dup), - // newValue - new(OpCodes.Ldarg_1), + // GetInvertedNoClipStatus(player) + new(OpCodes.Call, Method(typeof(TogglingNoClip), nameof(GetInvertedNoClipStatus))), - // true - new(OpCodes.Ldc_I4_1), + // FpcNoclip.IsPermitted(hub) + new(OpCodes.Ldloc_0), + new(OpCodes.Call, Method(typeof(FpcNoclip), nameof(FpcNoclip.IsPermitted))), - // TogglingNoClipEventArgs ev = new(Player, bool) + // TogglingNoClipEventArgs ev = new(player, GetInvertedNoClipStatus(player), FpcNoclip.IsPermitted(hub)); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TogglingNoClipEventArgs))[0]), new(OpCodes.Dup), new(OpCodes.Dup), - new(OpCodes.Stloc_S, ev.LocalIndex), + new(OpCodes.Stloc_S, ev), - // Handlers.Player.OnTogglingNoClip(ev) + // Handlers.Player.OnTogglingNoClip(ev); new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnTogglingNoClip))), // if (!ev.IsAllowed) @@ -64,10 +76,15 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } + + private static bool GetInvertedNoClipStatus(Player player) => player.Role is FpcRole fpc && !fpc.IsNoclipEnabled; + + private static bool GetNoClipStatus(Player player) => player.Role is FpcRole fpc && fpc.IsNoclipEnabled; } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/TogglingOverwatch.cs b/Exiled.Events/Patches/Events/Player/TogglingOverwatch.cs index 0b1b4fd9dc..d264722d9c 100644 --- a/Exiled.Events/Patches/Events/Player/TogglingOverwatch.cs +++ b/Exiled.Events/Patches/Events/Player/TogglingOverwatch.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Player using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -21,6 +21,7 @@ namespace Exiled.Events.Patches.Events.Player /// /// patches to add the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.TogglingOverwatch))] [HarmonyPatch(typeof(ServerRoles), nameof(ServerRoles.SetOverwatchStatus), typeof(byte))] internal static class TogglingOverwatch { diff --git a/Exiled.Events/Patches/Events/Player/Transmitting.cs b/Exiled.Events/Patches/Events/Player/Transmitting.cs index a7c54df1c2..10dcc2a9a3 100644 --- a/Exiled.Events/Patches/Events/Player/Transmitting.cs +++ b/Exiled.Events/Patches/Events/Player/Transmitting.cs @@ -12,12 +12,11 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; - using Mirror; - using PlayerRoles.Voice; using VoiceChat.Playbacks; @@ -28,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Transmitting))] [HarmonyPatch(typeof(PersonalRadioPlayback), nameof(PersonalRadioPlayback.Update))] internal static class Transmitting { @@ -37,7 +37,7 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(PersonalRadioPlayback), nameof(PersonalRadioPlayback.IsTransmitting)))) + offset; diff --git a/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs b/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs index 5b3ea57468..bbc034a75d 100644 --- a/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs +++ b/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.TriggeringTesla))] [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))] internal static class TriggeringTesla { diff --git a/Exiled.Events/Patches/Events/Player/UsedItem.cs b/Exiled.Events/Patches/Events/Player/UsedItem.cs deleted file mode 100644 index 7af1ee1f03..0000000000 --- a/Exiled.Events/Patches/Events/Player/UsedItem.cs +++ /dev/null @@ -1,109 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Player -{ - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features; - using API.Features.Pools; - - using Exiled.Events.EventArgs.Player; - - using HarmonyLib; - - using InventorySystem.Items; - using InventorySystem.Items.Usables; - using InventorySystem.Items.Usables.Scp1576; - - using static HarmonyLib.AccessTools; - -#pragma warning disable SA1600 // Elements should be documented -#pragma warning disable SA1402 // File may only contain a single type - - /// - /// Patches - /// Adds the event. - /// - [HarmonyPatch(typeof(Consumable), nameof(Consumable.ServerOnUsingCompleted))] - internal static class UsedItem - { - internal static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int index = 0; - - newInstructions.InsertRange(index, InstructionsToInject()); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - - internal static List InstructionsToInject() => new List - { - // Player.Get(this.Owner) - new(OpCodes.Ldarg_0), - new(OpCodes.Callvirt, PropertyGetter(typeof(ItemBase), nameof(ItemBase.Owner))), - new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - - // this - new(OpCodes.Ldarg_0), - - // UsedItemEventArgs ev = new(Player, UsableItem) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(UsedItemEventArgs))[0]), - new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnUsedItem))), - }; - } - - /// - /// Patches - /// Adds the event. - /// - [HarmonyPatch(typeof(Scp268), nameof(Scp268.ServerOnUsingCompleted))] - internal static class UsedItem268 - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int index = 0; - - newInstructions.InsertRange(index, UsedItem.InstructionsToInject()); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches - /// Adds the event. - /// - [HarmonyPatch(typeof(Scp1576Item), nameof(Scp1576Item.ServerOnUsingCompleted))] - internal static class UsedItem1576 - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int index = 0; - - newInstructions.InsertRange(index, UsedItem.InstructionsToInject()); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/UsingAndCancellingItemUse.cs b/Exiled.Events/Patches/Events/Player/UsingAndCancellingItemUse.cs index e2a98aeda5..f8e373c702 100644 --- a/Exiled.Events/Patches/Events/Player/UsingAndCancellingItemUse.cs +++ b/Exiled.Events/Patches/Events/Player/UsingAndCancellingItemUse.cs @@ -8,23 +8,31 @@ namespace Exiled.Events.Patches.Events.Player { using System.Collections.Generic; + using System.Reflection; using System.Reflection.Emit; using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; using InventorySystem.Items.Usables; + using PluginAPI.Events; + using static HarmonyLib.AccessTools; /// /// Patches . - /// Adds the event. + /// Adds the event, + /// event and + /// event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.CancellingItemUse))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.UsingItem))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.CancelledItemUse))] [HarmonyPatch(typeof(UsableItemsController), nameof(UsableItemsController.ServerReceivedStatus))] internal static class UsingAndCancellingItemUse { @@ -74,8 +82,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + offset = -16; + index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Newobj && (ConstructorInfo)instruction.operand == GetDeclaredConstructors(typeof(PlayerCancelUsingItemEvent))[0]) + offset; newInstructions.InsertRange( index, @@ -103,6 +111,29 @@ private static IEnumerable Transpiler(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Player +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; + using System.Reflection.Emit; + + using API.Features; + using API.Features.Pools; + + using Exiled.Events.EventArgs.Player; + + using HarmonyLib; + + using InventorySystem.Items.Usables; + using Mirror; + + using static HarmonyLib.AccessTools; + +#pragma warning disable SA1600 // Elements should be documented + + /// + /// Patches + /// Adds the event. + /// + [HarmonyPatch(typeof(UsableItemsController), nameof(UsableItemsController.Update))] + internal static class UsingItemCompleted + { + internal static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + Label continueLabel = generator.DefineLabel(); + Label retLabel = generator.DefineLabel(); + + int offset = -1; + int index = newInstructions.FindIndex(i => i.Calls(Method(typeof(Dictionary.Enumerator), nameof(Dictionary.Enumerator.MoveNext)))) + offset; + + newInstructions[index].labels.Add(retLabel); + + offset = -2; + index = newInstructions.FindIndex(x => x.Calls(Method(typeof(UsableItem), nameof(UsableItem.ServerOnUsingCompleted)))) + offset; + + newInstructions.InsertRange(index, new[] + { + // Player.Get(keyValuePair.Key) + new CodeInstruction(OpCodes.Ldloca_S, 1).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Call, PropertyGetter(typeof(KeyValuePair), nameof(KeyValuePair.Key))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // currentUsable.Item + new(OpCodes.Ldloc_2), + new(OpCodes.Ldfld, Field(typeof(CurrentlyUsedItem), nameof(CurrentlyUsedItem.Item))), + + // UsingItemCompletedEventArgs ev = new(Player, UsableItem) + // Handlers.Player.OnUsingItemCompleted(ev) + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(UsingItemCompletedEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnUsingItemCompleted))), + + // if (ev.IsAllowed) goto continueLabel; + new(OpCodes.Call, PropertyGetter(typeof(UsingItemCompletedEventArgs), nameof(UsingItemCompletedEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + // currentUsable.Item.OnUsingCancelled(); + new(OpCodes.Ldloc_2), + new(OpCodes.Ldfld, Field(typeof(CurrentlyUsedItem), nameof(CurrentlyUsedItem.Item))), + new(OpCodes.Callvirt, Method(typeof(UsableItem), nameof(UsableItem.OnUsingCancelled))), + + // keyValuePair.Value.CurrentUsable = CurrentlyUsedItem.None; + new(OpCodes.Ldloca_S, 1), + new(OpCodes.Call, PropertyGetter(typeof(KeyValuePair), nameof(KeyValuePair.Value))), + new(OpCodes.Ldsfld, Field(typeof(CurrentlyUsedItem), nameof(CurrentlyUsedItem.None))), + new(OpCodes.Stfld, Field(typeof(PlayerHandler), nameof(PlayerHandler.CurrentUsable))), + + // keyValuePair.Key.inventory.connectionToClient.Send(new StatusMessage(StatusMessage.StatusType.Cancel, currentUsable.ItemSerial), 0); + // + // keyValuePair.Key.inventory.connectionToClient + new(OpCodes.Ldloca_S, 1), + new(OpCodes.Call, PropertyGetter(typeof(KeyValuePair), nameof(KeyValuePair.Key))), + new(OpCodes.Ldfld, Field(typeof(ReferenceHub), nameof(ReferenceHub.inventory))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Mirror.NetworkBehaviour), nameof(Mirror.NetworkBehaviour.connectionToClient))), + new(OpCodes.Ldc_I4_1), + new(OpCodes.Ldloc_2), + new(OpCodes.Ldfld, Field(typeof(CurrentlyUsedItem), nameof(CurrentlyUsedItem.ItemSerial))), + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(StatusMessage))[0]), + new(OpCodes.Ldc_I4_0), + new(OpCodes.Callvirt, FirstMethod( + typeof(Mirror.NetworkConnection), + m => + { + return m.IsGenericMethod && m.Name == nameof(Mirror.NetworkConnection.Send); + }).MakeGenericMethod(typeof(StatusMessage))), + + // goto ret; + new(OpCodes.Br_S, retLabel), + new CodeInstruction(OpCodes.Nop).WithLabels(continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Player/UsingMicroHIDEnergy.cs b/Exiled.Events/Patches/Events/Player/UsingMicroHIDEnergy.cs index 40b1ea0237..0ae2849afd 100644 --- a/Exiled.Events/Patches/Events/Player/UsingMicroHIDEnergy.cs +++ b/Exiled.Events/Patches/Events/Player/UsingMicroHIDEnergy.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,8 +25,9 @@ namespace Exiled.Events.Patches.Events.Player /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.UsingMicroHIDEnergy))] [HarmonyPatch(typeof(MicroHIDItem), nameof(MicroHIDItem.ExecuteServerside))] internal static class UsingMicroHIDEnergy { diff --git a/Exiled.Events/Patches/Events/Player/UsingRadioBattery.cs b/Exiled.Events/Patches/Events/Player/UsingRadioBattery.cs index f8aceb872b..c81e2ed362 100644 --- a/Exiled.Events/Patches/Events/Player/UsingRadioBattery.cs +++ b/Exiled.Events/Patches/Events/Player/UsingRadioBattery.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Player /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.UsingRadioBattery))] [HarmonyPatch(typeof(RadioItem), nameof(RadioItem.Update))] internal static class UsingRadioBattery { @@ -38,8 +39,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldloc_0) + offset; + const int offset = 1; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Stloc_0) + offset; newInstructions[index].WithLabels(continueLabel); diff --git a/Exiled.Events/Patches/Events/Player/Verified.cs b/Exiled.Events/Patches/Events/Player/Verified.cs index ee1a800dcf..c5da68a7c9 100644 --- a/Exiled.Events/Patches/Events/Player/Verified.cs +++ b/Exiled.Events/Patches/Events/Player/Verified.cs @@ -15,6 +15,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Pools; using Exiled.API.Extensions; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; @@ -22,10 +23,10 @@ namespace Exiled.Events.Patches.Events.Player using static HarmonyLib.AccessTools; /// - /// Patches . + /// Patches . /// Adds the event. /// - [HarmonyPatch(typeof(ServerRoles), nameof(ServerRoles.UserCode_CmdServerSignatureComplete))] + [HarmonyPatch(typeof(ServerRoles), nameof(ServerRoles.UserCode_CmdServerSignatureComplete__String__String__String__Boolean))] internal static class Verified { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) @@ -55,7 +56,7 @@ private static IEnumerable Transpiler(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Player +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features.Pools; + using API.Features.Roles; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Player; + + using HarmonyLib; + + using Mirror; + + using PlayerRoles.Voice; + + using VoiceChat.Networking; + + using static HarmonyLib.AccessTools; + + /// + /// patches to add the event. + /// + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.VoiceChatting))] + [HarmonyPatch(typeof(VoiceTransceiver), nameof(VoiceTransceiver.ServerReceiveMessage))] + internal static class VoiceChatting + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label retLabel = generator.DefineLabel(); + Label isMutedLabel = generator.DefineLabel(); + List
// TODO: REWORK TRANSPILER + [EventPatch(typeof(Handlers.Scp049), nameof(Handlers.Scp049.ActivatingSense))] [HarmonyPatch] public class ActivatingSense { @@ -46,7 +47,7 @@ private static IEnumerable OnSendingSense(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Scp049 +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Scp049; + using HarmonyLib; + using PlayerRoles.PlayableScps.Scp049; + using PlayerRoles.PlayableScps.Subroutines; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add event. + /// + [EventPatch(typeof(Handlers.Scp049), nameof(Handlers.Scp049.Attacking))] + [HarmonyPatch(typeof(Scp049AttackAbility), nameof(Scp049AttackAbility.ServerProcessCmd))] + internal class Attacking + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + int offset = -3; + int index = newInstructions.FindIndex(x => x.Calls(Method(typeof(AbilityCooldown), nameof(AbilityCooldown.Trigger)))) + offset; + + Label continueLabel = generator.DefineLabel(); + + newInstructions.InsertRange( + index, + new[] + { + // Player player = Player.Get(this.Owner); + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp049AttackAbility), nameof(Scp049AttackAbility.Owner))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // Player target = Player.Get(this._target); + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(Scp049AttackAbility), nameof(Scp049AttackAbility._target))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // true + new(OpCodes.Ldc_I4_1), + + // AttackingEventArgs ev = new(player, target, true); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(AttackingEventArgs))[0]), + new(OpCodes.Dup), + + // Handlers.Scp049.OnAttacking(ev); + new(OpCodes.Call, Method(typeof(Handlers.Scp049), nameof(Handlers.Scp049.OnAttacking))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(AttackingEventArgs), nameof(AttackingEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + new(OpCodes.Ret), + + new CodeInstruction(OpCodes.Nop).WithLabels(continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp049/Consuming.cs b/Exiled.Events/Patches/Events/Scp049/Consuming.cs deleted file mode 100644 index a11cdaa876..0000000000 --- a/Exiled.Events/Patches/Events/Scp049/Consuming.cs +++ /dev/null @@ -1,102 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Scp049 -{ - using System.Collections.Generic; - using System.Reflection.Emit; - - using Exiled.API.Features; - using Exiled.API.Features.Pools; - - using Exiled.Events.EventArgs.Scp049; - - using HarmonyLib; - - using PlayerRoles; - using PlayerRoles.PlayableScps.Scp049; - using PlayerRoles.PlayableScps.Scp049.Zombies; - - using UnityEngine; - - using static HarmonyLib.AccessTools; - - /// - /// Patches - /// RagdollAbilityBase{T}.ServerProcessCmd - /// - /// . - /// Adds the event. - /// - // TODO: REWORK TRANSPILER - [HarmonyPatch] - public class Consuming - { - [HarmonyTranspiler] - [HarmonyPatch(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase.ServerProcessCmd))] - private static IEnumerable OnConsumingCorpse(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - int offset = -1; - int index = newInstructions.FindLastIndex(instrc => instrc.LoadsField(Field(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase._errorCode)))) + offset; - Label retLabel = generator.DefineLabel(); - - newInstructions.InsertRange(index, new CodeInstruction[] - { - new (OpCodes.Ldarg_0), - new (OpCodes.Call, Method(typeof(Consuming), nameof(Consuming.ServerProcessConsume))), - new (OpCodes.Br, retLabel), - }); - - newInstructions[newInstructions.Count - 1].WithLabels(retLabel); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - - /// - /// Processes RagDoll ability for the Zombie interaction. - /// - /// parameterized . - private static void ServerProcessConsume(RagdollAbilityBase zombieAbility) - { - Transform transform = zombieAbility._ragdollTransform; - - Ragdoll currentRagDoll = Ragdoll.Get(zombieAbility.CurRagdoll); - - Player zombiePlayer = Player.Get(zombieAbility.Owner); - - ZombieConsumeAbility.ConsumeError errorCode = (ZombieConsumeAbility.ConsumeError)zombieAbility._errorCode; - - if (zombiePlayer.Role.Type != RoleTypeId.Scp049) - { - ConsumingCorpseEventArgs ev = new(zombiePlayer, currentRagDoll, errorCode); - Handlers.Scp049.OnConsumingCorpse(ev); - - if (!ev.IsAllowed) - return; - - currentRagDoll = ev.Ragdoll; - errorCode = ev.ErrorCode; - } - - bool errorCodeFlag = errorCode != ZombieConsumeAbility.ConsumeError.None; - - if (errorCodeFlag) - { - zombieAbility._ragdollTransform = transform; - zombieAbility.CurRagdoll = currentRagDoll.Base; - zombieAbility.ServerSendRpc(true); - return; - } - - zombieAbility.IsInProgress = true; - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp049/FinishingRecall.cs b/Exiled.Events/Patches/Events/Scp049/FinishingRecall.cs index 6457dd2b48..a8a55d3a8e 100644 --- a/Exiled.Events/Patches/Events/Scp049/FinishingRecall.cs +++ b/Exiled.Events/Patches/Events/Scp049/FinishingRecall.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp049 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp049; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp049 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp049), nameof(Handlers.Scp049.FinishingRecall))] [HarmonyPatch(typeof(Scp049ResurrectAbility), nameof(Scp049ResurrectAbility.ServerComplete))] internal static class FinishingRecall { @@ -33,8 +34,8 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - const int offset = 0; - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Ldc_I4_S) + offset; + const int offset = -5; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; Label returnLabel = generator.DefineLabel(); diff --git a/Exiled.Events/Patches/Events/Scp049/SendingCall.cs b/Exiled.Events/Patches/Events/Scp049/SendingCall.cs index 6b6b9b6a10..b9182f087c 100644 --- a/Exiled.Events/Patches/Events/Scp049/SendingCall.cs +++ b/Exiled.Events/Patches/Events/Scp049/SendingCall.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp049 using Exiled.API.Features; using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp049; using HarmonyLib; @@ -25,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp049 /// Adds the event. ///
// TODO: REWORK TRANSPILER + [EventPatch(typeof(Handlers.Scp049), nameof(Handlers.Scp049.SendingCall))] [HarmonyPatch] public class SendingCall { @@ -69,4 +71,4 @@ private static void ProcessCall(Scp049CallAbility callAbility) callAbility.ServerSendRpc(true); } } -} +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp049/StartingRecall.cs b/Exiled.Events/Patches/Events/Scp049/StartingRecall.cs index c8902d450f..f027a5f5a6 100644 --- a/Exiled.Events/Patches/Events/Scp049/StartingRecall.cs +++ b/Exiled.Events/Patches/Events/Scp049/StartingRecall.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp049 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp049; using HarmonyLib; @@ -25,23 +25,47 @@ namespace Exiled.Events.Patches.Events.Scp049 /// Patches . /// Adds the event. ///
- // TODO: REWORK TRANSPILER + [EventPatch(typeof(Handlers.Scp049), nameof(Handlers.Scp049.StartingRecall))] [HarmonyPatch(typeof(Scp049ResurrectAbility), nameof(Scp049ResurrectAbility.ServerValidateBegin))] internal static class StartingRecall { - [HarmonyTranspiler] - private static IEnumerable ServerValidateBegin(IEnumerable instructions, ILGenerator generator) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); Label retLabel = generator.DefineLabel(); - newInstructions.InsertRange(0, new[] + newInstructions.InsertRange(0, new CodeInstruction[] { - new CodeInstruction(OpCodes.Ldarg_0), - new CodeInstruction(OpCodes.Ldarg_1), - new CodeInstruction(OpCodes.Call, Method(typeof(StartingRecall), nameof(ReviveProcess))), - new CodeInstruction(OpCodes.Br, retLabel), + // Player player = Player.Get(this.Owner); + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp049ResurrectAbility), nameof(Scp049ResurrectAbility.Owner))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // Player target = Player.Get(ragdoll.Info.OwnerHub); + new(OpCodes.Ldarg_1), + new(OpCodes.Ldfld, Field(typeof(BasicRagdoll), nameof(BasicRagdoll.Info))), + new(OpCodes.Ldfld, Field(typeof(RagdollData), nameof(RagdollData.OwnerHub))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // Ragdoll doll = Rangdoll.Get(ragdoll); + new(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Ragdoll), nameof(Ragdoll.Get), new[] { typeof(BasicRagdoll) })), + + // true + new(OpCodes.Ldc_I4_1), + + // StartingRecallEventArgs ev = new(player, target, doll, true); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(StartingRecallEventArgs))[0]), + new(OpCodes.Dup), + + // Handlers.Scp049.OnStartingRecall(ev); + new(OpCodes.Call, Method(typeof(Handlers.Scp049), nameof(Handlers.Scp049.OnStartingRecall))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(StartingRecallEventArgs), nameof(StartingRecallEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, retLabel), }); newInstructions[newInstructions.Count - 1].WithLabels(retLabel); @@ -50,24 +74,5 @@ private static IEnumerable ServerValidateBegin(IEnumerable.Pool.Return(newInstructions); } - - private static bool ReviveProcess(Scp049ResurrectAbility resurrectAbility, BasicRagdoll ragdoll) - { - Player currentScp = Player.Get(resurrectAbility.Owner); - Player targetPlayer = Player.Get(ragdoll.Info.OwnerHub); - Ragdoll targetRagdoll = Ragdoll.Get(ragdoll); - - StartingRecallEventArgs ev = new(targetPlayer, currentScp, targetRagdoll); - Handlers.Scp049.OnStartingRecall(ev); - - if (!ev.IsAllowed) - return true; - - Scp049ResurrectAbility.ResurrectError resurrectError = resurrectAbility.CheckBeginConditions(ragdoll); - if (resurrectError != Scp049ResurrectAbility.ResurrectError.None) - return true; - - return !resurrectAbility.ServerValidateAny(); - } } } diff --git a/Exiled.Events/Patches/Events/Scp0492/Consuming.cs b/Exiled.Events/Patches/Events/Scp0492/Consuming.cs new file mode 100644 index 0000000000..6cfe439772 --- /dev/null +++ b/Exiled.Events/Patches/Events/Scp0492/Consuming.cs @@ -0,0 +1,87 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Scp0492 +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Scp0492; + using HarmonyLib; + using PlayerRoles.PlayableScps.Scp049; + using PlayerRoles.PlayableScps.Scp049.Zombies; + using PlayerRoles.PlayableScps.Subroutines; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add event. + /// + [EventPatch(typeof(Handlers.Scp0492), nameof(Handlers.Scp0492.ConsumingCorpse))] + [HarmonyPatch(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase.ServerProcessCmd))] + public class Consuming + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + int offset = 2; + int index = newInstructions.FindIndex(instrc => instrc.Calls(Method(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase.ServerValidateBegin)))) + offset; + + Label retLabel = generator.DefineLabel(); + LocalBuilder ev = generator.DeclareLocal(typeof(ConsumingCorpseEventArgs)); + + newInstructions.InsertRange(index, new CodeInstruction[] + { + // this.Owner + new (OpCodes.Ldarg_0), + new (OpCodes.Callvirt, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), + + // this.CurRagdoll + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase.CurRagdoll))), + + // this._errorCode + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase._errorCode))), + + // true + new(OpCodes.Ldc_I4_1), + + // ConsumingCorpseEventArgs = new(this.Owner, this.Ragdoll, this._errorCode, true) + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ConsumingCorpseEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc, ev.LocalIndex), + + // Handlers.Scp0492.OnConsumingCorpse(ev) + new(OpCodes.Call, Method(typeof(Handlers.Scp0492), nameof(Handlers.Scp0492.OnConsumingCorpse))), + + // if (!ev.IsAllowed) + // return + new(OpCodes.Callvirt, PropertyGetter(typeof(ConsumingCorpseEventArgs), nameof(ConsumingCorpseEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, retLabel), + + new(OpCodes.Ret), + + // this._errorCode = ev.ErrorCode + new CodeInstruction(OpCodes.Ldloc, ev.LocalIndex).WithLabels(retLabel), + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(ConsumingCorpseEventArgs), nameof(ConsumingCorpseEventArgs.ErrorCode))), + new(OpCodes.Stfld, Field(typeof(RagdollAbilityBase), nameof(RagdollAbilityBase._errorCode))), + }); + + foreach (var instruction in newInstructions) + yield return instruction; + + ListPool.Pool.Return(newInstructions); + } + } +} diff --git a/Exiled.Events/Patches/Events/Scp0492/TriggeringBloodlustEvent.cs b/Exiled.Events/Patches/Events/Scp0492/TriggeringBloodlustEvent.cs new file mode 100644 index 0000000000..596ae1a64a --- /dev/null +++ b/Exiled.Events/Patches/Events/Scp0492/TriggeringBloodlustEvent.cs @@ -0,0 +1,60 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Scp0492 +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Scp0492; + + using HarmonyLib; + + using PlayerRoles.PlayableScps.Scp049.Zombies; + + using static HarmonyLib.AccessTools; + + /// + /// Patches the method to add the . + /// + [EventPatch(typeof(Handlers.Scp0492), nameof(Handlers.Scp0492.TriggeringBloodlust))] + [HarmonyPatch(typeof(ZombieBloodlustAbility), nameof(ZombieBloodlustAbility.AnyTargets))] + internal static class TriggeringBloodlustEvent + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + Label continueLabel = newInstructions[newInstructions.FindIndex(i => i.opcode == OpCodes.Leave_S) + 1].labels[0]; + + const int offset = -1; + int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Stloc_S) + offset; + + newInstructions.InsertRange(index, new CodeInstruction[] + { + new(OpCodes.Ldloc_1), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + new(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TriggeringBloodlustEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Call, Method(typeof(Handlers.Scp0492), nameof(Handlers.Scp0492.OnTriggeringBloodlust))), + new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringBloodlustEventArgs), nameof(TriggeringBloodlustEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp079/ChangingCamera.cs b/Exiled.Events/Patches/Events/Scp079/ChangingCamera.cs index 108a6a969a..fea4deffb5 100644 --- a/Exiled.Events/Patches/Events/Scp079/ChangingCamera.cs +++ b/Exiled.Events/Patches/Events/Scp079/ChangingCamera.cs @@ -11,17 +11,14 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; using HarmonyLib; using Mirror; - - using PlayerRoles.PlayableScps.Scp079; using PlayerRoles.PlayableScps.Scp079.Cameras; - using PlayerRoles.PlayableScps.Subroutines; using static HarmonyLib.AccessTools; @@ -29,8 +26,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event. + /// Adds the event. /// + [EventPatch(typeof(Scp079), nameof(Scp079.ChangingCamera))] [HarmonyPatch(typeof(Scp079CurrentCameraSync), nameof(Scp079CurrentCameraSync.ServerProcessCmd))] internal static class ChangingCamera { @@ -79,7 +77,7 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the and the events. ///
+ [EventPatch(typeof(Scp079), nameof(Scp079.ChangingSpeakerStatus))] + [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.VoiceChatting))] [HarmonyPatch(typeof(VoiceModuleBase), nameof(VoiceModuleBase.ServerIsSending), MethodType.Setter)] internal static class ChangingSpeakerStatusAndVoiceChatting { @@ -39,19 +40,10 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. ///
+ [EventPatch(typeof(Scp079), nameof(Scp079.ElevatorTeleporting))] [HarmonyPatch(typeof(Scp079ElevatorStateChanger), nameof(Scp079ElevatorStateChanger.ServerProcessCmd))] internal static class ElevatorTeleporting { diff --git a/Exiled.Events/Patches/Events/Scp079/GainingExperience.cs b/Exiled.Events/Patches/Events/Scp079/GainingExperience.cs index 51ffb46f5c..d5ed4370ae 100644 --- a/Exiled.Events/Patches/Events/Scp079/GainingExperience.cs +++ b/Exiled.Events/Patches/Events/Scp079/GainingExperience.cs @@ -11,12 +11,13 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; using HarmonyLib; + using PlayerRoles; using PlayerRoles.PlayableScps.Scp079; using PlayerRoles.PlayableScps.Subroutines; @@ -25,9 +26,10 @@ namespace Exiled.Events.Patches.Events.Scp079 using Player = API.Features.Player; /// - /// Patches . + /// Patches . /// Adds the event. /// + [EventPatch(typeof(Scp079), nameof(Scp079.GainingExperience))] [HarmonyPatch(typeof(Scp079TierManager), nameof(Scp079TierManager.ServerGrantExperience))] internal static class GainingExperience { @@ -55,10 +57,13 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable. /// Adds the event. ///
+ [EventPatch(typeof(Scp079), nameof(Scp079.GainingLevel))] [HarmonyPatch(typeof(Scp079TierManager), nameof(Scp079TierManager.AccessTierIndex), MethodType.Setter)] internal static class GainingLevel { diff --git a/Exiled.Events/Patches/Events/Scp079/InteractingTesla.cs b/Exiled.Events/Patches/Events/Scp079/InteractingTesla.cs index 654db5e653..95d17bde23 100644 --- a/Exiled.Events/Patches/Events/Scp079/InteractingTesla.cs +++ b/Exiled.Events/Patches/Events/Scp079/InteractingTesla.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; @@ -28,8 +28,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. /// + [EventPatch(typeof(Scp079), nameof(Scp079.InteractingTesla))] [HarmonyPatch(typeof(Scp079TeslaAbility), nameof(Scp079TeslaAbility.ServerProcessCmd))] internal static class InteractingTesla { diff --git a/Exiled.Events/Patches/Events/Scp079/LockingDown.cs b/Exiled.Events/Patches/Events/Scp079/LockingDown.cs index f3aee28a47..5d6c57ddb3 100644 --- a/Exiled.Events/Patches/Events/Scp079/LockingDown.cs +++ b/Exiled.Events/Patches/Events/Scp079/LockingDown.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; @@ -29,8 +29,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. /// + [EventPatch(typeof(Scp079), nameof(Scp079.LockingDown))] [HarmonyPatch(typeof(Scp079LockdownRoomAbility), nameof(Scp079LockdownRoomAbility.ServerProcessCmd))] internal static class LockingDown { @@ -42,8 +43,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ldc_I4_S) + offset; + int offset = -6; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; // LockingDownEventArgs ev = new(Player.Get(base.Owner), base.CurrentCamSync.CurrentCamera.Room, (float)this._cost); // diff --git a/Exiled.Events/Patches/Events/Scp079/Pinging.cs b/Exiled.Events/Patches/Events/Scp079/Pinging.cs index 470197be5a..9e0a05c75d 100644 --- a/Exiled.Events/Patches/Events/Scp079/Pinging.cs +++ b/Exiled.Events/Patches/Events/Scp079/Pinging.cs @@ -11,11 +11,11 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using HarmonyLib; using Mirror; using PlayerRoles.PlayableScps.Scp079.Pinging; - using PluginAPI.Core; using RelativePositioning; using UnityEngine; @@ -23,8 +23,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. /// + [EventPatch(typeof(Handlers.Scp079), nameof(Handlers.Scp079.Pinging))] [HarmonyPatch(typeof(Scp079PingAbility), nameof(Scp079PingAbility.ServerProcessCmd))] internal static class Pinging { @@ -55,7 +56,7 @@ private static void ProcessPinging(Scp079PingAbility instance, NetworkReader rea { RelativePosition curRelativePos = reader.ReadRelativePosition(); Vector3 syncNormal = reader.ReadVector3(); - PingingEventArgs ev = new PingingEventArgs(instance.Owner, curRelativePos, instance._cost, instance._syncProcessorIndex, syncNormal); + PingingEventArgs ev = new(instance.Owner, curRelativePos, instance._cost, instance._syncProcessorIndex, syncNormal); Handlers.Scp079.OnPinging(ev); diff --git a/Exiled.Events/Patches/Events/Scp079/RoomBlackout.cs b/Exiled.Events/Patches/Events/Scp079/RoomBlackout.cs index dd74f67933..c9921589c6 100644 --- a/Exiled.Events/Patches/Events/Scp079/RoomBlackout.cs +++ b/Exiled.Events/Patches/Events/Scp079/RoomBlackout.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using HarmonyLib; @@ -22,8 +22,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. /// + [EventPatch(typeof(Handlers.Scp079), nameof(Handlers.Scp079.Pinging))] [HarmonyPatch(typeof(Scp079BlackoutRoomAbility), nameof(Scp079BlackoutRoomAbility.ServerProcessCmd))] internal static class RoomBlackout { diff --git a/Exiled.Events/Patches/Events/Scp079/TriggeringDoor.cs b/Exiled.Events/Patches/Events/Scp079/TriggeringDoor.cs index e3f05111f8..973d0b765e 100644 --- a/Exiled.Events/Patches/Events/Scp079/TriggeringDoor.cs +++ b/Exiled.Events/Patches/Events/Scp079/TriggeringDoor.cs @@ -11,14 +11,13 @@ namespace Exiled.Events.Patches.Events.Scp079 using System.Reflection.Emit; using API.Features.Pools; + using Exiled.API.Features.Doors; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp079; using Exiled.Events.Handlers; - using HarmonyLib; - using Interactables.Interobjects.DoorUtils; - using PlayerRoles.PlayableScps.Scp079; using PlayerRoles.PlayableScps.Subroutines; @@ -28,8 +27,9 @@ namespace Exiled.Events.Patches.Events.Scp079 /// /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. /// + [EventPatch(typeof(Scp079), nameof(Scp079.Pinging))] [HarmonyPatch(typeof(Scp079DoorStateChanger), nameof(Scp079DoorStateChanger.ServerProcessCmd))] internal static class TriggeringDoor { @@ -91,7 +91,7 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . - /// Adds the event for SCP-079. + /// Adds the event for SCP-079. ///
+ [EventPatch(typeof(Handlers.Scp079), nameof(Handlers.Scp079.Pinging))] [HarmonyPatch(typeof(Scp079BlackoutZoneAbility), nameof(Scp079BlackoutZoneAbility.ServerProcessCmd))] internal static class ZoneBlackout { @@ -31,7 +32,7 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - int offset = 4; + int offset = 3; int index = newInstructions.FindIndex( instruction => instruction.LoadsField(Field(typeof(Scp079BlackoutZoneAbility), nameof(Scp079BlackoutZoneAbility._syncZone)))) + offset; diff --git a/Exiled.Events/Patches/Events/Scp096/AddingTarget.cs b/Exiled.Events/Patches/Events/Scp096/AddingTarget.cs index fb752f5f9c..919be16574 100644 --- a/Exiled.Events/Patches/Events/Scp096/AddingTarget.cs +++ b/Exiled.Events/Patches/Events/Scp096/AddingTarget.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.AddingTarget))] [HarmonyPatch(typeof(Scp096TargetsTracker), nameof(Scp096TargetsTracker.AddTarget))] internal static class AddingTarget { diff --git a/Exiled.Events/Patches/Events/Scp096/CalmingDown.cs b/Exiled.Events/Patches/Events/Scp096/CalmingDown.cs index b87edfbdb1..1b37578c11 100644 --- a/Exiled.Events/Patches/Events/Scp096/CalmingDown.cs +++ b/Exiled.Events/Patches/Events/Scp096/CalmingDown.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.CalmingDown))] [HarmonyPatch(typeof(Scp096RageManager), nameof(Scp096RageManager.ServerEndEnrage))] internal static class CalmingDown { @@ -50,12 +51,8 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Owner) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), diff --git a/Exiled.Events/Patches/Events/Scp096/Charging.cs b/Exiled.Events/Patches/Events/Scp096/Charging.cs index d2ca7f5f84..3584c2ecc8 100644 --- a/Exiled.Events/Patches/Events/Scp096/Charging.cs +++ b/Exiled.Events/Patches/Events/Scp096/Charging.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -28,6 +28,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.Charging))] [HarmonyPatch(typeof(Scp096ChargeAbility), nameof(Scp096ChargeAbility.ServerProcessCmd))] internal static class Charging { @@ -50,12 +51,8 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Owner) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), diff --git a/Exiled.Events/Patches/Events/Scp096/Enraging.cs b/Exiled.Events/Patches/Events/Scp096/Enraging.cs index 3a4053db6a..0ec8bb3d86 100644 --- a/Exiled.Events/Patches/Events/Scp096/Enraging.cs +++ b/Exiled.Events/Patches/Events/Scp096/Enraging.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.Enraging))] [HarmonyPatch(typeof(Scp096RageManager), nameof(Scp096RageManager.ServerEnrage))] internal static class Enraging { @@ -50,12 +51,8 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Owner) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), diff --git a/Exiled.Events/Patches/Events/Scp096/StartPryingGate.cs b/Exiled.Events/Patches/Events/Scp096/StartPryingGate.cs index d07035bd5c..9c708c4649 100644 --- a/Exiled.Events/Patches/Events/Scp096/StartPryingGate.cs +++ b/Exiled.Events/Patches/Events/Scp096/StartPryingGate.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -30,6 +30,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches the method. /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.StartPryingGate))] [HarmonyPatch(typeof(Scp096PrygateAbility), nameof(Scp096PrygateAbility.ServerProcessCmd))] internal static class StartPryingGate { @@ -52,12 +53,8 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Owner) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), diff --git a/Exiled.Events/Patches/Events/Scp096/TryingNotToCry.cs b/Exiled.Events/Patches/Events/Scp096/TryingNotToCry.cs index a2eb67ef38..49b711c4c4 100644 --- a/Exiled.Events/Patches/Events/Scp096/TryingNotToCry.cs +++ b/Exiled.Events/Patches/Events/Scp096/TryingNotToCry.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp096 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp096; using HarmonyLib; @@ -28,6 +28,7 @@ namespace Exiled.Events.Patches.Events.Scp096 /// Patches the method. /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp096), nameof(Handlers.Scp096.TryingNotToCry))] [HarmonyPatch(typeof(Scp096TryNotToCryAbility), nameof(Scp096TryNotToCryAbility.ServerProcessCmd))] internal static class TryingNotToCry { @@ -50,19 +51,15 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Owner) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), // true new(OpCodes.Ldc_I4_1), - // TryingNotToCryEventArgs ev = new(Scp096Role, Player, DoorVariant, bool); + // TryingNotToCryEventArgs ev = new(Player, DoorVariant, bool); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TryingNotToCryEventArgs))[0]), new(OpCodes.Dup), diff --git a/Exiled.Events/Patches/Events/Scp106/Attacking.cs b/Exiled.Events/Patches/Events/Scp106/Attacking.cs new file mode 100644 index 0000000000..eabb03019e --- /dev/null +++ b/Exiled.Events/Patches/Events/Scp106/Attacking.cs @@ -0,0 +1,83 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Scp106 +{ + using System.Collections.Generic; + using System.Linq; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Map; + using Exiled.Events.EventArgs.Scp106; + using Footprinting; + using HarmonyLib; + using InventorySystem.Items.ThrowableProjectiles; + using PlayerRoles.PlayableScps.Scp106; + using PlayerRoles.PlayableScps.Subroutines; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add event. + /// + [EventPatch(typeof(Handlers.Scp106), nameof(Handlers.Scp106.Attacking))] + [HarmonyPatch(typeof(Scp106Attack), nameof(Scp106Attack.ServerShoot))] + internal class Attacking + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + int offset = 2; + int index = newInstructions.FindIndex(x => x.Calls(Method(typeof(Scp106Attack), nameof(Scp106Attack.SendCooldown)))) + offset; + Label continueLabel = generator.DefineLabel(); + + newInstructions.InsertRange( + index, + new CodeInstruction[] + { + // Player player = Player.Get(this.Owner); + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp106Attack), nameof(Scp106Attack.Owner))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // Player target = Player.Get(this._targetHub); + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(Scp106Attack), nameof(Scp106Attack._targetHub))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + // true + new(OpCodes.Ldc_I4_1), + + // AttackingEventArgs ev = new(player, target, true); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(AttackingEventArgs))[0]), + new(OpCodes.Dup), + + // Handlers.Scp106.OnAttacking(ev); + new(OpCodes.Call, Method(typeof(Handlers.Scp106), nameof(Handlers.Scp106.OnAttacking))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(AttackingEventArgs), nameof(AttackingEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + new(OpCodes.Leave, newInstructions[newInstructions.Count - 1].labels.First()), + + new CodeInstruction(OpCodes.Nop).WithLabels(continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp106/Stalking.cs b/Exiled.Events/Patches/Events/Scp106/Stalking.cs index e026f097a3..cffbbbf740 100644 --- a/Exiled.Events/Patches/Events/Scp106/Stalking.cs +++ b/Exiled.Events/Patches/Events/Scp106/Stalking.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp106 using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp106; using HarmonyLib; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp106 /// To add the event. ///
// TODO: REWORK TRANSPILER + [EventPatch(typeof(Handlers.Scp106), nameof(Handlers.Scp106.Stalking))] [HarmonyPatch] public class Stalking { diff --git a/Exiled.Events/Patches/Events/Scp106/Teleporting.cs b/Exiled.Events/Patches/Events/Scp106/Teleporting.cs index 4e289f65e2..1150cd7c71 100644 --- a/Exiled.Events/Patches/Events/Scp106/Teleporting.cs +++ b/Exiled.Events/Patches/Events/Scp106/Teleporting.cs @@ -11,91 +11,79 @@ namespace Exiled.Events.Patches.Events.Scp106 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp106; using Exiled.Events.Handlers; - using HarmonyLib; - using PlayerRoles.PlayableScps.Scp106; - using PlayerRoles.PlayableScps.Subroutines; + using UnityEngine; using static HarmonyLib.AccessTools; using Player = API.Features.Player; /// - /// Patches . - /// Adds the event. + /// Patches . + /// Adds the event. /// - [HarmonyPatch(typeof(Scp106HuntersAtlasAbility), nameof(Scp106HuntersAtlasAbility.ServerProcessCmd))] + [EventPatch(typeof(Scp106), nameof(Scp106.Teleporting))] + [HarmonyPatch(typeof(Scp106HuntersAtlasAbility), nameof(Scp106HuntersAtlasAbility.GetSafePosition))] internal static class Teleporting { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - // The index offset. - const int offset = 1; - - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Stloc_0) + offset; - - // Declare TeleportingEventArgs, to be able to store its instance. LocalBuilder ev = generator.DeclareLocal(typeof(TeleportingEventArgs)); + Label continueLabel = generator.DefineLabel(); - // Get the count to find the previous index - int oldCount = newInstructions.Count; + int offset = -2; + int index = newInstructions.FindLastIndex(x => x.opcode == OpCodes.Ret) + offset; - // Define the return label for the last instruction. - Label returnLabel = generator.DefineLabel(); - - // TeleportingEventArgs ev = new TeleportingEventArgs(Player.Get(base.Owner), this.Position, true); - // - // Handlers.Scp106.OnTeleporting(ev); - // - // if (!ev.IsAllowed) - // return; - // - // position = ev.Position; newInstructions.InsertRange( index, - new CodeInstruction[] + new[] { - // Player.Get(base.Owner) + // Player player = Player.Get(this.Owner); new(OpCodes.Ldarg_0), - new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp106HuntersAtlasAbility), nameof(Scp106HuntersAtlasAbility.Owner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - // position + // safePosition new(OpCodes.Ldloc_0), // true new(OpCodes.Ldc_I4_1), - // TeleportingEventArgs ev = new(Player, Vector3, bool) + // TeleportingEventArgs ev = new(player, safePosition, true); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TeleportingEventArgs))[0]), new(OpCodes.Dup), new(OpCodes.Dup), - new(OpCodes.Stloc_S, ev.LocalIndex), + new(OpCodes.Stloc, ev.LocalIndex), - // Scp106.OnTeleporting(ev) + // Handlers.Scp106.OnTeleporting(ev) new(OpCodes.Call, Method(typeof(Scp106), nameof(Scp106.OnTeleporting))), - // if (!ev.IsAllowed) - // return; + // if (ev.IsAllowed) + // goto continueLabel; new(OpCodes.Callvirt, PropertyGetter(typeof(TeleportingEventArgs), nameof(TeleportingEventArgs.IsAllowed))), - new(OpCodes.Brfalse_S, returnLabel), + new(OpCodes.Brtrue_S, continueLabel), + + // return this.Owner.transform.position; + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp106HuntersAtlasAbility), nameof(Scp106HuntersAtlasAbility.Owner))), + new(OpCodes.Callvirt, PropertyGetter(typeof(ReferenceHub), nameof(ReferenceHub.transform))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Transform), nameof(Transform.position))), + new(OpCodes.Ret), - // position = ev.Position - new(OpCodes.Ldloc_S, ev.LocalIndex), + // safePosition = ev.Position; + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex).WithLabels(continueLabel), new(OpCodes.Callvirt, PropertyGetter(typeof(TeleportingEventArgs), nameof(TeleportingEventArgs.Position))), new(OpCodes.Stloc_0), }); - newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; + foreach (var instruction in newInstructions) + yield return instruction; ListPool.Pool.Return(newInstructions); } diff --git a/Exiled.Events/Patches/Events/Scp173/Blinking.cs b/Exiled.Events/Patches/Events/Scp173/Blinking.cs index a92deda419..33334acda8 100644 --- a/Exiled.Events/Patches/Events/Scp173/Blinking.cs +++ b/Exiled.Events/Patches/Events/Scp173/Blinking.cs @@ -13,10 +13,13 @@ namespace Exiled.Events.Patches.Events.Scp173 using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp173; using HarmonyLib; + using PlayerRoles; + using PlayerRoles.PlayableScps.Scp173; using PlayerRoles.PlayableScps.Subroutines; @@ -28,6 +31,7 @@ namespace Exiled.Events.Patches.Events.Scp173 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp173), nameof(Handlers.Scp173.Blinking))] [HarmonyPatch(typeof(Scp173BlinkTimer), nameof(Scp173BlinkTimer.ServerBlink))] internal static class Blinking { @@ -43,9 +47,10 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.Owner))), + new(OpCodes.Callvirt, PropertyGetter(typeof(ScpSubroutineBase), nameof(ScpSubroutineBase.Role))), + new(OpCodes.Ldfld, Field(typeof(PlayerRoleBase), nameof(PlayerRoleBase._lastOwner))), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), // this._observers.Observers diff --git a/Exiled.Events/Patches/Events/Scp173/PlacingTantrum.cs b/Exiled.Events/Patches/Events/Scp173/PlacingTantrum.cs index 462ab9dbbb..0958702029 100644 --- a/Exiled.Events/Patches/Events/Scp173/PlacingTantrum.cs +++ b/Exiled.Events/Patches/Events/Scp173/PlacingTantrum.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp173 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp173; using HarmonyLib; @@ -29,6 +29,7 @@ namespace Exiled.Events.Patches.Events.Scp173 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp173), nameof(Handlers.Scp173.PlacingTantrum))] [HarmonyPatch(typeof(Scp173TantrumAbility), nameof(Scp173TantrumAbility.ServerProcessCmd))] internal static class PlacingTantrum { @@ -40,10 +41,8 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls( - Method(typeof(NetworkServer), nameof(NetworkServer.Spawn), new[] { typeof(GameObject), typeof(NetworkConnection) }))) + offset; + const int offset = -2; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Newobj) + offset; // PlacingTantrumEventArgs ev = new(this, Player, gameObject, cooldown, true); // @@ -57,12 +56,8 @@ private static IEnumerable Transpiler(IEnumerable), nameof(ScpStandardSubroutine.ScpRole))), - // Player.Get(base.Hub) - new(OpCodes.Ldarg_0), + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), new(OpCodes.Call, PropertyGetter(typeof(ScpStandardSubroutine), nameof(ScpStandardSubroutine.Owner))), new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })), @@ -76,7 +71,7 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Scp173), nameof(Handlers.Scp173.UsingBreakneckSpeeds))] [HarmonyPatch(typeof(Scp173BreakneckSpeedsAbility), nameof(Scp173BreakneckSpeedsAbility.IsActive), MethodType.Setter)] internal static class UsingBreakneckSpeeds { diff --git a/Exiled.Events/Patches/Events/Scp244/DamagingScp244.cs b/Exiled.Events/Patches/Events/Scp244/DamagingScp244.cs index 48d6d1bc34..3cc14e71e4 100644 --- a/Exiled.Events/Patches/Events/Scp244/DamagingScp244.cs +++ b/Exiled.Events/Patches/Events/Scp244/DamagingScp244.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp244 using API.Features.DamageHandlers; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp244; using Handlers; @@ -25,8 +25,9 @@ namespace Exiled.Events.Patches.Events.Scp244 /// /// Patches to add missing logic to the - /// . + /// . /// + [EventPatch(typeof(Scp244), nameof(Scp244.DamagingScp244))] [HarmonyPatch(typeof(Scp244DeployablePickup), nameof(Scp244DeployablePickup.Damage))] internal static class DamagingScp244 { diff --git a/Exiled.Events/Patches/Events/Scp244/UpdateScp244.cs b/Exiled.Events/Patches/Events/Scp244/UpdateScp244.cs index 06ed3edabb..bc3d4002a8 100644 --- a/Exiled.Events/Patches/Events/Scp244/UpdateScp244.cs +++ b/Exiled.Events/Patches/Events/Scp244/UpdateScp244.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp244 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp244; using Handlers; @@ -24,9 +24,10 @@ namespace Exiled.Events.Patches.Events.Scp244 using static HarmonyLib.AccessTools; /// - /// Patches to add missing event handler to the - /// . + /// Patches to add missing event handler to the + /// . /// + [EventPatch(typeof(Scp244), nameof(Scp244.OpeningScp244))] [HarmonyPatch(typeof(Scp244DeployablePickup), nameof(Scp244DeployablePickup.UpdateRange))] internal static class UpdateScp244 { diff --git a/Exiled.Events/Patches/Events/Scp244/UsingScp244.cs b/Exiled.Events/Patches/Events/Scp244/UsingScp244.cs index 2e111720d7..55e1139173 100644 --- a/Exiled.Events/Patches/Events/Scp244/UsingScp244.cs +++ b/Exiled.Events/Patches/Events/Scp244/UsingScp244.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp244 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp244; using Handlers; @@ -26,8 +26,9 @@ namespace Exiled.Events.Patches.Events.Scp244 /// /// Patches to add missing event handler to the - /// . + /// . /// + [EventPatch(typeof(Scp244), nameof(Scp244.UsingScp244))] [HarmonyPatch(typeof(Scp244Item), nameof(Scp244Item.ServerOnUsingCompleted))] internal static class UsingScp244 { diff --git a/Exiled.Events/Patches/Events/Scp330/DroppingCandy.cs b/Exiled.Events/Patches/Events/Scp330/DroppingCandy.cs index 7519585410..6f1f61e6ca 100644 --- a/Exiled.Events/Patches/Events/Scp330/DroppingCandy.cs +++ b/Exiled.Events/Patches/Events/Scp330/DroppingCandy.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp330 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp330; using Handlers; @@ -31,6 +31,7 @@ namespace Exiled.Events.Patches.Events.Scp330 /// Patches the method to add the /// event. ///
+ [EventPatch(typeof(Scp330), nameof(Scp330.DroppingScp330))] [HarmonyPatch(typeof(Scp330NetworkHandler), nameof(Scp330NetworkHandler.ServerSelectMessageReceived))] internal static class DroppingCandy { diff --git a/Exiled.Events/Patches/Events/Scp330/EatingScp330.cs b/Exiled.Events/Patches/Events/Scp330/EatingScp330.cs index ba1dba2601..d8dd465865 100644 --- a/Exiled.Events/Patches/Events/Scp330/EatingScp330.cs +++ b/Exiled.Events/Patches/Events/Scp330/EatingScp330.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp330 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp330; using Handlers; @@ -28,6 +28,8 @@ namespace Exiled.Events.Patches.Events.Scp330 /// Patches . /// Adds the and event. ///
+ [EventPatch(typeof(Scp330), nameof(Scp330.EatingScp330))] + [EventPatch(typeof(Scp330), nameof(Scp330.EatenScp330))] [HarmonyPatch(typeof(Scp330Bag), nameof(Scp330Bag.ServerOnUsingCompleted))] internal static class EatingScp330 { diff --git a/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs b/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs index f891816f32..92025db533 100644 --- a/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs +++ b/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs @@ -13,7 +13,7 @@ namespace Exiled.Events.Patches.Events.Scp330 using API.Features.Pools; using CustomPlayerEffects; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp330; using Exiled.Events.Handlers; @@ -32,6 +32,7 @@ namespace Exiled.Events.Patches.Events.Scp330 /// Patches the method to add the /// event. ///
+ [EventPatch(typeof(Scp330), nameof(Scp330.InteractingScp330))] [HarmonyPatch(typeof(Scp330Interobject), nameof(Scp330Interobject.ServerInteract))] public static class InteractingScp330 { @@ -111,6 +112,7 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Ret) + includeSameLine; + Label originalLabel = newInstructions[addShouldSeverIndex].ExtractLabels()[0]; // Remove original code from after RpcMakeSound to next return and then fully replace it. newInstructions.RemoveRange(addShouldSeverIndex, nextReturn - addShouldSeverIndex); @@ -124,7 +126,7 @@ private static IEnumerable Transpiler(IEnumerable /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Scp914), nameof(Scp914.Activating))] [HarmonyPatch(typeof(Scp914Controller), nameof(Scp914Controller.ServerInteract))] internal static class InteractingEvents { - private static bool Prefix(Scp914Controller __instance, ReferenceHub ply, byte colliderId) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - if (__instance._remainingCooldown > 0.0) - return false; + List newInstructions = ListPool.Pool.Get(instructions); + LocalBuilder ev = generator.DeclareLocal(typeof(ChangingKnobSettingEventArgs)); + + Label ret = generator.DefineLabel(); + + int offset = 1; + int index = newInstructions.FindLastIndex(i => i.opcode == OpCodes.Stloc_1) + offset; - switch ((Scp914InteractCode)colliderId) + newInstructions.InsertRange(index, new[] { - case Scp914InteractCode.ChangeMode: - Scp914KnobSetting scp914KnobSetting; + // Player.Get(ply) + new CodeInstruction(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - if (__instance._knobSetting + 1 > Scp914KnobSetting.VeryFine) - scp914KnobSetting = Scp914KnobSetting.Rough; - else - scp914KnobSetting = __instance._knobSetting + 1; + // scp914KnobSetting + new CodeInstruction(OpCodes.Ldloc_1), - ChangingKnobSettingEventArgs ev = new(Player.Get(ply), scp914KnobSetting); + // true + new(OpCodes.Ldc_I4_1), - Scp914.OnChangingKnobSetting(ev); + // ChangingKnobSettingEventArgs ev = new(referenceHub, scp914KnobSetting, isAllowed); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChangingKnobSettingEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev.LocalIndex), - if (!ev.IsAllowed) - return false; + // Scp914.OnChangingKnobSetting(ev); + new(OpCodes.Call, Method(typeof(Scp914), nameof(Scp914.OnChangingKnobSetting))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingKnobSettingEventArgs), nameof(ChangingKnobSettingEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, ret), + + // scp914KnobSetting = ev.KnobSetting + new(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingKnobSettingEventArgs), nameof(ChangingKnobSettingEventArgs.KnobSetting))), + new(OpCodes.Stloc_1), + }); + + offset = -3; + index = newInstructions.FindLastIndex(i => i.opcode == OpCodes.Newobj) + offset; + + newInstructions.InsertRange(index, new[] + { + // Player.Get(ply) + new CodeInstruction(OpCodes.Ldarg_1).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - __instance._remainingCooldown = __instance._knobChangeCooldown; + // true + new(OpCodes.Ldc_I4_1), - scp914KnobSetting = ev.KnobSetting; + // ActivatingEventArgs ev2 = new(referenceHub, scp914KnobSetting, isAllowed); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ActivatingEventArgs))[0]), + new(OpCodes.Dup), - __instance.Network_knobSetting = scp914KnobSetting; - __instance.RpcPlaySound(0); - break; - case Scp914InteractCode.Activate: - ActivatingEventArgs ev2 = new(Player.Get(ply)); + // Scp914.OnActivating(ev2); + new(OpCodes.Call, Method(typeof(Scp914), nameof(Scp914.OnActivating))), - Scp914.OnActivating(ev2); + // if (!ev2.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(ActivatingEventArgs), nameof(ActivatingEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, ret), + }); - if (!ev2.IsAllowed) - return false; + newInstructions[newInstructions.Count - 1].labels.Add(ret); - __instance._remainingCooldown = __instance._totalSequenceTime; - __instance._isUpgrading = true; - __instance._itemsAlreadyUpgraded = false; - __instance.RpcPlaySound(1); - break; - } + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; - return false; + ListPool.Pool.Return(newInstructions); } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp914/UpgradingItem.cs b/Exiled.Events/Patches/Events/Scp914/UpgradingItem.cs index 4544b8b6fd..7469efb927 100644 --- a/Exiled.Events/Patches/Events/Scp914/UpgradingItem.cs +++ b/Exiled.Events/Patches/Events/Scp914/UpgradingItem.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp914 using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp914; using global::Scp914; @@ -26,6 +26,7 @@ namespace Exiled.Events.Patches.Events.Scp914 /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Scp914), nameof(Scp914.UpgradingPickup))] [HarmonyPatch(typeof(Scp914Upgrader), nameof(Scp914Upgrader.ProcessPickup))] internal static class UpgradingItem { diff --git a/Exiled.Events/Patches/Events/Scp914/UpgradingPlayer.cs b/Exiled.Events/Patches/Events/Scp914/UpgradingPlayer.cs index 24d5d71546..fffd2e5e99 100644 --- a/Exiled.Events/Patches/Events/Scp914/UpgradingPlayer.cs +++ b/Exiled.Events/Patches/Events/Scp914/UpgradingPlayer.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Scp914 using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp914; using global::Scp914; using HarmonyLib; @@ -26,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Scp914 /// Patches /// to add the event. ///
+ [EventPatch(typeof(Scp914), nameof(Scp914.UpgradingPlayer))] [HarmonyPatch(typeof(Scp914Upgrader), nameof(Scp914Upgrader.ProcessPlayer))] internal static class UpgradingPlayer { @@ -137,7 +139,7 @@ private static IEnumerable Transpiler(IEnumerable +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Scp939 +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Scp939; + using HarmonyLib; + using PlayerRoles.PlayableScps.Scp939; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add event. + /// + [EventPatch(typeof(Handlers.Scp939), nameof(Handlers.Scp939.Clawed))] + [HarmonyPatch(typeof(Scp939ClawAbility), nameof(Scp939ClawAbility.ServerProcessCmd))] + internal class Clawed + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + newInstructions.InsertRange( + newInstructions.Count - 1, new CodeInstruction[] + { + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp939ClawAbility), nameof(Scp939ClawAbility.Owner))), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ClawedEventArgs))[0]), + + new(OpCodes.Call, Method(typeof(Handlers.Scp939), nameof(Handlers.Scp939.OnClawed))), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp939/Focus.cs b/Exiled.Events/Patches/Events/Scp939/Focus.cs index 33ff114443..30107ccf99 100644 --- a/Exiled.Events/Patches/Events/Scp939/Focus.cs +++ b/Exiled.Events/Patches/Events/Scp939/Focus.cs @@ -7,7 +7,11 @@ namespace Exiled.Events.Patches.Events.Scp939 { -#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; @@ -16,25 +20,68 @@ namespace Exiled.Events.Patches.Events.Scp939 using PlayerRoles.PlayableScps.Scp939; + using static HarmonyLib.AccessTools; + /// /// Patches /// to add the event. /// + [EventPatch(typeof(Scp939), nameof(Scp939.ChangingFocus))] [HarmonyPatch(typeof(Scp939FocusKeySync), nameof(Scp939FocusKeySync.ServerProcessCmd))] internal static class Focus { - private static bool Prefix(Scp939FocusKeySync __instance, NetworkReader reader) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - bool state = reader.ReadBoolean(); - ChangingFocusEventArgs ev = new(__instance.Owner, state); - Scp939.OnChangingFocus(ev); + List newInstructions = ListPool.Pool.Get(instructions); + + LocalBuilder state = generator.DeclareLocal(typeof(bool)); + + Label ret = generator.DefineLabel(); - if (ev.IsAllowed) + int offset = -3; + int index = newInstructions.FindIndex(i => i.operand == (object)PropertySetter(typeof(Scp939FocusKeySync), nameof(Scp939FocusKeySync.FocusKeyHeld))) + offset; + + // Remove argument for this.FocusKeyHeld(reader.ReadBool()) to overwrite them in InsertRange + newInstructions.RemoveRange(index, 3); + + newInstructions.InsertRange(index, new[] { - __instance.FocusKeyHeld = state; - } + // this.Owner + new CodeInstruction(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp939FocusKeySync), nameof(Scp939FocusKeySync.Owner))), + + // reader.ReadBool() + new(OpCodes.Ldarg_1), + new(OpCodes.Callvirt, Method(typeof(NetworkReaderExtensions), nameof(NetworkReaderExtensions.ReadBool))), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, state.LocalIndex), + + // true + new(OpCodes.Ldc_I4_1), + + // ChangingFocusEventArgs ev = new(referenceHub, state, isAllowed); + new CodeInstruction(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChangingFocusEventArgs))[0]), + new(OpCodes.Dup), + + // Scp939.OnChangingFocus(ev); + new(OpCodes.Call, Method(typeof(Scp939), nameof(Scp939.OnChangingFocus))), + + // if (!ev.IsAllowed) return; + new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingFocusEventArgs), nameof(ChangingFocusEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, ret), + + // this + // ev.State + new(OpCodes.Ldarg_0), + new(OpCodes.Ldloc, state.LocalIndex), + }); + + newInstructions[newInstructions.Count - 1].labels.Add(ret); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; - return false; + ListPool.Pool.Return(newInstructions); } } -} +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp939/Lunge.cs b/Exiled.Events/Patches/Events/Scp939/Lunge.cs index 28afc7a534..09b2f57607 100644 --- a/Exiled.Events/Patches/Events/Scp939/Lunge.cs +++ b/Exiled.Events/Patches/Events/Scp939/Lunge.cs @@ -7,105 +7,50 @@ namespace Exiled.Events.Patches.Events.Scp939 { + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; using HarmonyLib; using Mirror; - using PlayerRoles; - using PlayerRoles.FirstPersonControl; using PlayerRoles.PlayableScps.Scp939; - using RelativePositioning; - using UnityEngine; - using Utils.Networking; -#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + using static HarmonyLib.AccessTools; + /// /// Patches - /// to add the event. + /// to add the event. /// - [HarmonyPatch(typeof(Scp939LungeAbility), nameof(Scp939LungeAbility.ServerProcessCmd))] + [EventPatch(typeof(Scp939), nameof(Scp939.Lunging))] + [HarmonyPatch(typeof(Scp939LungeAbility), nameof(Scp939LungeAbility.TriggerLunge))] internal static class Lunge { - private static bool Prefix(Scp939LungeAbility __instance, NetworkReader reader) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - Vector3 vector = reader.ReadRelativePosition().Position; - ReferenceHub referenceHub = reader.ReadReferenceHub(); - RelativePosition relativePosition = reader.ReadRelativePosition(); - if (__instance.State != Scp939LungeState.Triggered) - { - if (!__instance.IsReady) - return false; - - LungingEventArgs ev = new(__instance.Owner, __instance.IsReady); - Handlers.Scp939.OnLunging(ev); - if (!ev.IsAllowed) - return false; - - __instance.TriggerLunge(); - } - - HumanRole humanRole; - if (referenceHub == null || (humanRole = referenceHub.roleManager.CurrentRole as HumanRole) == null) - { - return false; - } + List newInstructions = ListPool.Pool.Get(instructions); - FirstPersonMovementModule fpcModule = humanRole.FpcModule; - using (new FpcBacktracker(referenceHub, relativePosition.Position)) + newInstructions.InsertRange(0, new CodeInstruction[] { - using (new FpcBacktracker(__instance.Owner, fpcModule.Position, Quaternion.identity)) - { - Vector3 vector2 = fpcModule.Position - __instance.ScpRole.FpcModule.Position; - if (vector2.SqrMagnitudeIgnoreY() > __instance._overallTolerance * __instance._overallTolerance) - { - return false; - } + // this.Owner + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp939LungeAbility), nameof(Scp939LungeAbility.Owner))), - if (vector2.y > __instance._overallTolerance || vector2.y < -__instance._bottomTolerance) - { - return false; - } - } - } + // LungingEventArgs ev = new (...) + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(LungingEventArgs))[0]), - using (new FpcBacktracker(__instance.Owner, vector, Quaternion.identity)) - { - vector = __instance.ScpRole.FpcModule.Position; - } - - Transform transform = referenceHub.transform; - Vector3 position = fpcModule.Position; - Quaternion rotation = transform.rotation; - Vector3 vector3 = new(vector.x, position.y, vector.z); - transform.forward = -__instance.Owner.transform.forward; - fpcModule.Position = vector3; - bool flag = referenceHub.playerStats.DealDamage(new Scp939DamageHandler(__instance.ScpRole, Scp939DamageType.LungeTarget)); - float num = flag ? 1f : 0f; - if (!flag || referenceHub.IsAlive()) - { - fpcModule.Position = position; - transform.rotation = rotation; - } - - foreach (ReferenceHub referenceHub2 in ReferenceHub.AllHubs) - { - HumanRole humanRole2; - if (!(referenceHub2 == referenceHub) && (humanRole2 = referenceHub2.roleManager.CurrentRole as HumanRole) != null - && (humanRole2.FpcModule.Position - vector3).sqrMagnitude <= __instance._secondaryRangeSqr - && referenceHub2.playerStats.DealDamage(new Scp939DamageHandler(__instance.ScpRole, Scp939DamageType.LungeSecondary))) - { - flag = true; - num = Mathf.Max(num, 0.6f); - } - } + // Scp939.OnLunging(ev) + new(OpCodes.Call, Method(typeof(Scp939), nameof(Scp939.OnLunging))), + }); - if (flag) + for (int z = 0; z < newInstructions.Count; z++) { - Hitmarker.SendHitmarker(__instance.Owner, num); + yield return newInstructions[z]; } - __instance.State = Scp939LungeState.LandHit; - return false; + ListPool.Pool.Return(newInstructions); } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Scp939/PlacingAmnesticCloud.cs b/Exiled.Events/Patches/Events/Scp939/PlacingAmnesticCloud.cs index a53e8b0ad4..9fd0be50b5 100644 --- a/Exiled.Events/Patches/Events/Scp939/PlacingAmnesticCloud.cs +++ b/Exiled.Events/Patches/Events/Scp939/PlacingAmnesticCloud.cs @@ -7,51 +7,113 @@ namespace Exiled.Events.Patches.Events.Scp939 { -#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; using HarmonyLib; using Mirror; - using PlayerRoles.PlayableScps.Scp939; + using PlayerRoles.PlayableScps.Subroutines; + + using static HarmonyLib.AccessTools; /// /// Patches /// to add the event. /// + [EventPatch(typeof(Scp939), nameof(Scp939.PlacingAmnesticCloud))] [HarmonyPatch(typeof(Scp939AmnesticCloudAbility), nameof(Scp939AmnesticCloudAbility.ServerProcessCmd))] internal static class PlacingAmnesticCloud { - private static bool Prefix(Scp939AmnesticCloudAbility __instance, NetworkReader reader) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - bool flag = reader.ReadBoolean(); - bool toAll = flag != __instance.TargetState; + List newInstructions = ListPool.Pool.Get(instructions); + + LocalBuilder ev = generator.DeclareLocal(typeof(PlacingAmnesticCloudEventArgs)); + + Label jump = generator.DefineLabel(); - PlacingAmnesticCloudEventArgs ev = new(__instance.Owner, flag, __instance.Cooldown.IsReady, __instance._failedCooldown); - Scp939.OnPlacingAmnesticCloud(ev); + int offset = 1; + int index = newInstructions.FindLastIndex(i => i.opcode == OpCodes.Stloc_1) + offset; - if (!ev.IsAllowed) + newInstructions[index].labels.Add(jump); + + newInstructions.InsertRange(index, new[] { - __instance.TargetState = false; - return false; - } + // this.Owner + new CodeInstruction(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp939AmnesticCloudAbility), nameof(Scp939AmnesticCloudAbility.Owner))), + + // flag (NewState) + new(OpCodes.Ldloc_0), + + // this.Cooldown.IsReady + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(Scp939AmnesticCloudAbility), nameof(Scp939AmnesticCloudAbility.Cooldown))), + new(OpCodes.Callvirt, PropertyGetter(typeof(AbilityCooldown), nameof(AbilityCooldown.IsReady))), + + // this._failedCooldown + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(Scp939AmnesticCloudAbility), nameof(Scp939AmnesticCloudAbility._failedCooldown))), - if (flag) + // true + new(OpCodes.Ldc_I4_1), + + // PlacingAmnesticCloudEventArgs ev = new(referenceHub, state, isReady, cooldown, isAllowed); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(PlacingAmnesticCloudEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev.LocalIndex), + + // Scp939.OnPlacingAmnesticCloud(ev); + new(OpCodes.Call, Method(typeof(Scp939), nameof(Scp939.OnPlacingAmnesticCloud))), + + // if (ev.IsAllowed) + // goto Jump; + new(OpCodes.Callvirt, PropertyGetter(typeof(PlacingAmnesticCloudEventArgs), nameof(PlacingAmnesticCloudEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, jump), + + // __instance.TargetState = false; + // return; + new(OpCodes.Ldarg_0), + new(OpCodes.Ldc_I4_0), + new(OpCodes.Callvirt, PropertySetter(typeof(Scp939AmnesticCloudAbility), nameof(Scp939AmnesticCloudAbility.TargetState))), + new(OpCodes.Ret), + }); + + // Remove this.Cooldown.IsReady from if (this.Cooldown.IsReady) + offset = -12; + index = newInstructions.FindLastIndex(i => i.operand == (object)Method(typeof(AbilityCooldown), nameof(AbilityCooldown.Trigger))) + offset; + newInstructions.RemoveRange(index, 2); + + newInstructions.InsertRange(index, new[] { - if (ev.IsReady) - { - __instance.TargetState = flag; - __instance.Cooldown.Trigger(ev.Cooldown); - } - } - else + // ev.IsReady + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(PlacingAmnesticCloudEventArgs), nameof(PlacingAmnesticCloudEventArgs.Cooldown))), + }); + + // Remove this._failedCooldown from this.Cooldown.Trigger(this._failedCooldown) + offset = -2; + index = newInstructions.FindLastIndex(i => i.operand == (object)PropertyGetter(typeof(AbilityCooldown), nameof(AbilityCooldown.IsReady))) + offset; + newInstructions.RemoveRange(index, 3); + + newInstructions.InsertRange(index, new[] { - __instance.TargetState = false; - } + // ev.Cooldown + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(PlacingAmnesticCloudEventArgs), nameof(PlacingAmnesticCloudEventArgs.IsReady))), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; - __instance.ServerSendRpc(toAll); - return false; + ListPool.Pool.Return(newInstructions); } } } diff --git a/Exiled.Events/Patches/Events/Scp939/PlayingSound.cs b/Exiled.Events/Patches/Events/Scp939/PlayingSound.cs index b2cfcac12b..b0bc00fc96 100644 --- a/Exiled.Events/Patches/Events/Scp939/PlayingSound.cs +++ b/Exiled.Events/Patches/Events/Scp939/PlayingSound.cs @@ -7,6 +7,7 @@ namespace Exiled.Events.Patches.Events.Scp939 { + using Exiled.Events.Attributes; #pragma warning disable SA1313 // Parameter names should begin with lower-case letter using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; @@ -21,23 +22,22 @@ namespace Exiled.Events.Patches.Events.Scp939 /// Patches /// to add the event. ///
+ [EventPatch(typeof(Scp939), nameof(Scp939.PlayingSound))] [HarmonyPatch(typeof(EnvironmentalMimicry), nameof(EnvironmentalMimicry.ServerProcessCmd))] internal static class PlayingSound { private static bool Prefix(EnvironmentalMimicry __instance, NetworkReader reader) { - byte category = reader.ReadByte(); byte option = reader.ReadByte(); - EnvMimicryOption sound = __instance.Categories[category].Options[option]; + EnvMimicrySequence sound = __instance.Sequences[option]; PlayingSoundEventArgs ev = new(__instance.Owner, sound, __instance.Cooldown.IsReady, __instance._activationCooldown, __instance.Cooldown.IsReady); Scp939.OnPlayingSound(ev); if (ev.IsReady && ev.IsAllowed) { - __instance._syncCat = category; - __instance._syncSound = option; + __instance._syncOption = option; __instance.Cooldown.Trigger(ev.Cooldown); __instance.ServerSendRpc(toAll: true); } diff --git a/Exiled.Events/Patches/Events/Scp939/PlayingVoice.cs b/Exiled.Events/Patches/Events/Scp939/PlayingVoice.cs index 2435210b03..6ee6ef33a3 100644 --- a/Exiled.Events/Patches/Events/Scp939/PlayingVoice.cs +++ b/Exiled.Events/Patches/Events/Scp939/PlayingVoice.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.Patches.Events.Scp939 using System.Reflection.Emit; using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; @@ -26,6 +27,7 @@ namespace Exiled.Events.Patches.Events.Scp939 /// Patches /// to add the event. ///
+ [EventPatch(typeof(Scp939), nameof(Scp939.PlayingVoice))] [HarmonyPatch(typeof(MimicryRecorder), nameof(MimicryRecorder.ServerProcessCmd))] internal static class PlayingVoice { diff --git a/Exiled.Events/Patches/Events/Scp939/SavingVoice.cs b/Exiled.Events/Patches/Events/Scp939/SavingVoice.cs index 94b76db785..976b2348ca 100644 --- a/Exiled.Events/Patches/Events/Scp939/SavingVoice.cs +++ b/Exiled.Events/Patches/Events/Scp939/SavingVoice.cs @@ -7,58 +7,68 @@ namespace Exiled.Events.Patches.Events.Scp939 { -#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Scp939; using Exiled.Events.Handlers; using HarmonyLib; - - using PlayerRoles.PlayableScps.Scp939; using PlayerRoles.PlayableScps.Scp939.Mimicry; using PlayerStatsSystem; - using VoiceChat; + + using static HarmonyLib.AccessTools; /// /// Patches /// to add the event. /// + [EventPatch(typeof(Scp939), nameof(Scp939.SavingVoice))] [HarmonyPatch(typeof(MimicryRecorder), nameof(MimicryRecorder.OnAnyPlayerKilled))] internal static class SavingVoice { - private static bool Prefix(MimicryRecorder __instance, ReferenceHub ply, DamageHandlerBase dh) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - if (dh is not Scp939DamageHandler scp939DamageHandler) - return false; + List newInstructions = ListPool.Pool.Get(instructions); + + Label ret = generator.DefineLabel(); - if (scp939DamageHandler.Attacker.Hub != __instance.Owner) - return false; + int offset = 3; + int index = newInstructions.FindIndex(i => i.operand == (object)Method(typeof(MimicryRecorder), nameof(MimicryRecorder.IsPrivacyAccepted))) + offset; - if (__instance.IsMuted(VoiceChatMutes.GetFlags(ply))) - return false; + newInstructions.InsertRange(index, new[] + { + // this.Owner + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Callvirt, PropertyGetter(typeof(MimicryRecorder), nameof(MimicryRecorder.Owner))), - // Should consider whether to allow users to have this with their own custom DNT - if (!__instance.IsPrivacyAccepted(ply)) - return false; + // ply + new CodeInstruction(OpCodes.Ldarg_1), - SavingVoiceEventArgs ev = new(__instance.Owner, ply); - Scp939.OnSavingVoice(ev); + // true + new(OpCodes.Ldc_I4_1), - if (!ev.IsAllowed) - { - return false; - } + // SavingVoiceEventArgs ev = new(referenceHub, ply, isAllowed); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(SavingVoiceEventArgs))[0]), + new(OpCodes.Dup), + + // Scp939.OnSavingVoice(ev); + new(OpCodes.Call, Method(typeof(Scp939), nameof(Scp939.OnSavingVoice))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(SavingVoiceEventArgs), nameof(SavingVoiceEventArgs.IsAllowed))), + new(OpCodes.Brfalse_S, ret), + }); - __instance._syncPlayer = ply; - __instance._syncMute = false; + newInstructions[newInstructions.Count - 1].labels.Add(ret); - if (__instance.Owner.isLocalPlayer) - __instance.SaveRecording(ply); - else - __instance.ServerSendRpc(false); + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; - __instance._serverSentVoices.Add(ply); - __instance._serverSentConfirmations.Remove(ply); - return false; + ListPool.Pool.Return(newInstructions); } } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Server/AddingUnitName.cs b/Exiled.Events/Patches/Events/Server/AddingUnitName.cs index bfb6ccdd40..e8fab3b4aa 100644 --- a/Exiled.Events/Patches/Events/Server/AddingUnitName.cs +++ b/Exiled.Events/Patches/Events/Server/AddingUnitName.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Server using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Server; using HarmonyLib; @@ -25,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Server /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.AddingUnitName))] [HarmonyPatch(typeof(UnitNameMessageHandler), nameof(UnitNameMessageHandler.SendNew))] internal static class AddingUnitName { diff --git a/Exiled.Events/Patches/Events/Server/ChoosingStartTeamQueue.cs b/Exiled.Events/Patches/Events/Server/ChoosingStartTeamQueue.cs new file mode 100644 index 0000000000..ef076b2034 --- /dev/null +++ b/Exiled.Events/Patches/Events/Server/ChoosingStartTeamQueue.cs @@ -0,0 +1,68 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Server +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features.Pools; + using Exiled.API.Features; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Server; + using HarmonyLib; + using PlayerRoles.RoleAssign; + + using static HarmonyLib.AccessTools; + + /// + /// Patches setter. + /// Adds the . + /// + [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.ChoosingStartTeamQueue))] + [HarmonyPatch(typeof(RoleAssigner), nameof(RoleAssigner.OnRoundStarted))] + internal static class ChoosingStartTeamQueue + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label continueLabel = generator.DefineLabel(); + + int offset = 0; + int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Dup) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // new ChoosingStartTeamEventArgs(string) + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChoosingStartTeamQueueEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Dup), + + // Handlers.Server.OnChoosingStartTeam(ev); + new(OpCodes.Call, Method(typeof(Handlers.Server), nameof(Handlers.Server.OnChoosingStartTeam))), + + // if (!ev.IsAllowed) + // return; + new(OpCodes.Callvirt, PropertyGetter(typeof(ChoosingStartTeamQueueEventArgs), nameof(ChoosingStartTeamQueueEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + new(OpCodes.Pop), + new(OpCodes.Ret), + + // ev.GetTeamRespawnQueue(); + new CodeInstruction(OpCodes.Callvirt, Method(typeof(ChoosingStartTeamQueueEventArgs), nameof(ChoosingStartTeamQueueEventArgs.GetTeamRespawnQueue))).WithLabels(continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Server/Reporting.cs b/Exiled.Events/Patches/Events/Server/Reporting.cs index a66601a452..6f58d608a5 100644 --- a/Exiled.Events/Patches/Events/Server/Reporting.cs +++ b/Exiled.Events/Patches/Events/Server/Reporting.cs @@ -11,7 +11,7 @@ namespace Exiled.Events.Patches.Events.Server using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using Exiled.Events.EventArgs.Server; using Exiled.Events.Handlers; @@ -25,10 +25,12 @@ namespace Exiled.Events.Patches.Events.Server using Player = API.Features.Player; /// - /// Patches . + /// Patches CheaterReport.UserCode_CmdReport__UInt32__String__Byte\u005B\u005D__Boolean(uint, string, byte[], bool) />. /// Adds the and events. /// - [HarmonyPatch(typeof(CheaterReport), nameof(CheaterReport.UserCode_CmdReport))] + [EventPatch(typeof(Server), nameof(Server.ReportingCheater))] + [EventPatch(typeof(Server), nameof(Server.LocalReporting))] + [HarmonyPatch(typeof(CheaterReport), @"UserCode_CmdReport__UInt32__String__Byte[]__Boolean")] internal static class Reporting { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) @@ -38,7 +40,7 @@ private static IEnumerable Transpiler(IEnumerable instruction.opcode == OpCodes.Newarr) + offset; Label ret = generator.DefineLabel(); @@ -90,10 +92,10 @@ private static IEnumerable Transpiler(IEnumerable. /// Adds the event. ///
+ [EventPatch(typeof(Server), nameof(Server.RespawningTeam))] [HarmonyPatch(typeof(RespawnManager), nameof(RespawnManager.Spawn))] internal static class RespawningTeam { @@ -35,8 +36,8 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); - const int offset = -2; - int index = newInstructions.FindIndex(instruction => instruction.opcode == OpCodes.Stloc_3) + offset; + int offset = -6; + int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(UnitNamingRule), nameof(UnitNamingRule.TryGetNamingRule)))) + offset; LocalBuilder ev = generator.DeclareLocal(typeof(RespawningTeamEventArgs)); @@ -47,7 +48,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable i.opcode == OpCodes.Callvirt && (MethodInfo)i.operand == Method(typeof(SpawnableTeamHandlerBase), nameof(SpawnableTeamHandlerBase.GenerateQueue))) + offset, 7); + for (int z = 0; z < newInstructions.Count; z++) yield return newInstructions[z]; diff --git a/Exiled.Events/Patches/Events/Server/RestartingRound.cs b/Exiled.Events/Patches/Events/Server/RestartingRound.cs index c22a8ecc5d..725a740c83 100644 --- a/Exiled.Events/Patches/Events/Server/RestartingRound.cs +++ b/Exiled.Events/Patches/Events/Server/RestartingRound.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Server using System.Reflection.Emit; using API.Features.Pools; - + using Exiled.Events.Attributes; using GameCore; using HarmonyLib; @@ -22,9 +22,10 @@ namespace Exiled.Events.Patches.Events.Server using static HarmonyLib.AccessTools; /// - /// Patches . - /// Adds the RestartingRound event. + /// Patches . + /// Adds the event. /// + [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.RestartingRound))] [HarmonyPatch(typeof(RoundRestart), nameof(RoundRestart.InitiateRoundRestart))] internal static class RestartingRound { diff --git a/Exiled.Events/Patches/Events/Server/RoundEnd.cs b/Exiled.Events/Patches/Events/Server/RoundEnd.cs index cb353ad635..fd8c028b83 100644 --- a/Exiled.Events/Patches/Events/Server/RoundEnd.cs +++ b/Exiled.Events/Patches/Events/Server/RoundEnd.cs @@ -13,21 +13,26 @@ namespace Exiled.Events.Patches.Events.Server using System.Reflection; using System.Reflection.Emit; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Server; + using GameCore; using HarmonyLib; using MEC; using PlayerRoles; using PluginAPI.Core; - using PluginAPI.Enums; using PluginAPI.Events; using RoundRestarting; using UnityEngine; + using Round = API.Features.Round; + /// /// Patches . /// Adds the and event. /// + [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.EndingRound))] + [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.RoundEnded))] [HarmonyPatch(typeof(RoundSummary), nameof(RoundSummary.Start))] internal static class RoundEnd { @@ -47,6 +52,9 @@ private static IEnumerator Process(RoundSummary roundSummary) RoundSummary.SumInfo_ClassList newList = default; foreach (ReferenceHub referenceHub in ReferenceHub.AllHubs) { + if (Round.IgnoredPlayers.Contains(referenceHub)) + continue; + switch (referenceHub.GetTeam()) { case Team.SCPs: @@ -109,7 +117,7 @@ private static IEnumerator Process(RoundSummary roundSummary) if (!roundSummary._roundEnded) { - RoundEndConditionsCheckCancellationData.RoundEndConditionsCheckCancellation cancellation = EventManager.ExecuteEvent(ServerEventType.RoundEndConditionsCheck, new object[] { shouldRoundEnd }).Cancellation; + RoundEndConditionsCheckCancellationData.RoundEndConditionsCheckCancellation cancellation = EventManager.ExecuteEvent(new RoundEndConditionsCheckEvent(shouldRoundEnd)).Cancellation; int num4 = (int)cancellation; if (num4 != 1) { @@ -146,17 +154,18 @@ private static IEnumerator Process(RoundSummary roundSummary) EndingRoundEventArgs endingRoundEventArgs = new(leadingTeam, newList, shouldRoundEnd); Handlers.Server.OnEndingRound(endingRoundEventArgs); + leadingTeam = (RoundSummary.LeadingTeam)endingRoundEventArgs.LeadingTeam; if (endingRoundEventArgs.IsRoundEnded) { roundSummary._roundEnded = true; - RoundEndCancellationData roundEndCancellationData = EventManager.ExecuteEvent(ServerEventType.RoundEnd, new object[] { leadingTeam }); + RoundEndCancellationData roundEndCancellationData = EventManager.ExecuteEvent(new RoundEndEvent(leadingTeam)); while (roundEndCancellationData.IsCancelled) { if (roundEndCancellationData.Delay <= 0f) break; yield return Timing.WaitForSeconds(roundEndCancellationData.Delay); - roundEndCancellationData = EventManager.ExecuteEvent(ServerEventType.RoundEnd, new object[] { leadingTeam }); + roundEndCancellationData = EventManager.ExecuteEvent(new RoundEndEvent(leadingTeam)); } if (Statistics.FastestEndedRound.Duration > RoundStart.RoundLength) @@ -181,7 +190,7 @@ private static IEnumerator Process(RoundSummary roundSummary) if (roundSummary != null) { roundSummary.RpcShowRoundSummary(roundSummary.classlistStart, newList, leadingTeam, RoundSummary.EscapedClassD, RoundSummary.EscapedScientists, RoundSummary.KilledBySCPs, num5, (int)RoundStart.RoundLength.TotalSeconds); - RoundEndedEventArgs roundEndedEventArgs = new(endingRoundEventArgs.LeadingTeam, newList, num5); + RoundEndedEventArgs roundEndedEventArgs = new((API.Enums.LeadingTeam)leadingTeam, newList, num5); Handlers.Server.OnRoundEnded(roundEndedEventArgs); } diff --git a/Exiled.Events/Patches/Events/Warhead/ChangingLeverStatus.cs b/Exiled.Events/Patches/Events/Warhead/ChangingLeverStatus.cs index 1282748de2..b37ae509b0 100644 --- a/Exiled.Events/Patches/Events/Warhead/ChangingLeverStatus.cs +++ b/Exiled.Events/Patches/Events/Warhead/ChangingLeverStatus.cs @@ -12,7 +12,7 @@ namespace Exiled.Events.Patches.Events.Warhead using API.Features; using API.Features.Pools; - + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Warhead; using HarmonyLib; @@ -22,10 +22,11 @@ namespace Exiled.Events.Patches.Events.Warhead using Warhead = Handlers.Warhead; /// - /// Patches . + /// Patches . /// Adds the event. /// - [HarmonyPatch(typeof(PlayerInteract), nameof(PlayerInteract.UserCode_CmdUsePanel))] + [EventPatch(typeof(Warhead), nameof(Warhead.ChangingLeverStatus))] + [HarmonyPatch(typeof(PlayerInteract), nameof(PlayerInteract.UserCode_CmdUsePanel__AlphaPanelOperations))] internal static class ChangingLeverStatus { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) diff --git a/Exiled.Events/Patches/Events/Warhead/Detonated.cs b/Exiled.Events/Patches/Events/Warhead/Detonated.cs deleted file mode 100644 index 368ac6f0ba..0000000000 --- a/Exiled.Events/Patches/Events/Warhead/Detonated.cs +++ /dev/null @@ -1,50 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Warhead -{ - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features.Pools; - - using Handlers; - - using HarmonyLib; - - using static HarmonyLib.AccessTools; - - /// - /// Patches . - /// Adds the WarheadDetonated event. - /// - [HarmonyPatch(typeof(AlphaWarheadController), nameof(AlphaWarheadController.Detonate))] - internal static class Detonated - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = 1; - int index = newInstructions.FindIndex( - instruction => instruction.Calls(Method(typeof(AlphaWarheadController), nameof(AlphaWarheadController.RpcShake)))) + offset; - - newInstructions.InsertRange( - index, - new[] - { - // Warhead.OnDetonated(); - new CodeInstruction(OpCodes.Call, Method(typeof(Warhead), nameof(Warhead.OnDetonated))), - }); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Warhead/Detonation.cs b/Exiled.Events/Patches/Events/Warhead/Detonation.cs new file mode 100644 index 0000000000..b5cdf09035 --- /dev/null +++ b/Exiled.Events/Patches/Events/Warhead/Detonation.cs @@ -0,0 +1,91 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Warhead +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Warhead; + using Handlers; + using HarmonyLib; + + using static HarmonyLib.AccessTools; + + /// + /// Patches + /// to add and events. + /// + [EventPatch(typeof(Warhead), nameof(Warhead.Detonated))] + [EventPatch(typeof(Warhead), nameof(Warhead.Detonating))] + [HarmonyPatch(typeof(AlphaWarheadController), nameof(AlphaWarheadController.Detonate))] + internal static class Detonation + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label continueLabel = generator.DefineLabel(); + LocalBuilder ev = generator.DeclareLocal(typeof(DetonatingEventArgs)); + + newInstructions[0].labels.Add(continueLabel); + + newInstructions.InsertRange( + 0, + new CodeInstruction[] + { + // DetonatingEventArgs ev = new(); + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(DetonatingEventArgs))[0]), + new(OpCodes.Stloc_S, ev.LocalIndex), + + // Handlers.Warhead.OnDetonating(ev); + new(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Call, Method(typeof(Warhead), nameof(Warhead.OnDetonating))), + + // if (ev.IsAllowed) + // goto continueLabel; + new(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(DetonatingEventArgs), nameof(DetonatingEventArgs.IsAllowed))), + new(OpCodes.Brtrue_S, continueLabel), + + // this.Info.StartTime = 0.0; + new(OpCodes.Ldarg_0), + new(OpCodes.Ldflda, Field(typeof(AlphaWarheadController), nameof(AlphaWarheadController.Info))), + new(OpCodes.Ldc_R8, 0.0), + new(OpCodes.Stfld, Field(typeof(AlphaWarheadSyncInfo), nameof(AlphaWarheadSyncInfo.StartTime))), + + // this.NetworkInfo = this.Info; + new(OpCodes.Ldarg_0), + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(AlphaWarheadController), nameof(AlphaWarheadController.Info))), + new(OpCodes.Callvirt, PropertySetter(typeof(AlphaWarheadController), nameof(AlphaWarheadController.NetworkInfo))), + + // return; + new(OpCodes.Ret), + }); + + const int offset = 1; + int index = newInstructions.FindIndex( + instruction => instruction.Calls(Method(typeof(AlphaWarheadController), nameof(AlphaWarheadController.RpcShake)))) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // Warhead.OnDetonated(); + new CodeInstruction(OpCodes.Call, Method(typeof(Warhead), nameof(Warhead.OnDetonated))), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Warhead/Starting.cs b/Exiled.Events/Patches/Events/Warhead/Starting.cs index 12edb8a2a2..dc52802057 100644 --- a/Exiled.Events/Patches/Events/Warhead/Starting.cs +++ b/Exiled.Events/Patches/Events/Warhead/Starting.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Warhead using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Warhead; using HarmonyLib; @@ -19,50 +20,50 @@ namespace Exiled.Events.Patches.Events.Warhead using static HarmonyLib.AccessTools; /// - /// Patch the . + /// Patch the . /// Adds the event. /// - [HarmonyPatch(typeof(PlayerInteract), nameof(PlayerInteract.UserCode_CmdDetonateWarhead))] + [EventPatch(typeof(Handlers.Warhead), nameof(Handlers.Warhead.Starting))] + [HarmonyPatch(typeof(AlphaWarheadController), nameof(AlphaWarheadController.StartDetonation))] internal static class Starting { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - const int offset = 0; - - int index = newInstructions.FindLastIndex(instruction => instruction.opcode == OpCodes.Ldsfld) + offset; - Label returnLabel = generator.DefineLabel(); + LocalBuilder ev = generator.DeclareLocal(typeof(StartingEventArgs)); - // if (!Warhead.CanBeStarted) - // return; - // - // StartingEventArgs ev = new(Player.Get(component), true); + const int offset = -2; + int index = newInstructions.FindIndex(instruction => instruction.StoresField(Field(typeof(AlphaWarheadController), nameof(AlphaWarheadController._isAutomatic)))) + offset; + + // StartingEventArgs ev = new(Player.Get(hub), isAutomatic, true); // // Handlers.Warhead.OnStarting(ev); // // if (!ev.IsAllowed) // return; + // + // IsAutomatic = ev.IsAuto; newInstructions.InsertRange( index, new[] { - // if (!Warhead.CanBestarted) - // return; - new CodeInstruction(OpCodes.Call, PropertyGetter(typeof(Warhead), nameof(Warhead.CanBeStarted))), - new(OpCodes.Brfalse_S, returnLabel), - - // Player.Get(component) - new(OpCodes.Ldloc_1), + // Player.Get(hub) + new CodeInstruction(OpCodes.Ldarg_3), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + // isAutomatic + new(OpCodes.Ldarg_1), + // true new(OpCodes.Ldc_I4_1), // StartingEventArgs ev = new(Player, bool); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(StartingEventArgs))[0]), new(OpCodes.Dup), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev.LocalIndex), // Handlers.Warhead.OnStarting(ev); new(OpCodes.Call, Method(typeof(Handlers.Warhead), nameof(Handlers.Warhead.OnStarting))), @@ -71,6 +72,11 @@ private static IEnumerable Transpiler(IEnumerable -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Warhead -{ -#pragma warning disable SA1402 - - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features; - using API.Features.Pools; - - using CommandSystem; - using CommandSystem.Commands.RemoteAdmin.ServerEvent; - using CommandSystem.Commands.RemoteAdmin.Warhead; - - using Exiled.Events.EventArgs.Warhead; - - using HarmonyLib; - - using static HarmonyLib.AccessTools; - - using Warhead = Handlers.Warhead; - - /// - /// Contains the instructions we will insert into multiple methods. - /// - internal static class StartingByCommand - { - /// - /// Inserts the needed instructions to a . - /// - /// The starting index to add instructions at. - /// The for the method being patched. - /// The of instructions to add to. - internal static void InsertInstructions(int index, ILGenerator generator, ref List instructions) - { - Label cdcLabel = generator.DefineLabel(); - - CodeInstruction[] instructionsToInsert = - { - // Player.Get(sender) - new CodeInstruction(OpCodes.Ldarg_2).MoveLabelsFrom(instructions[index]), - new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ICommandSender) })), - - // true - new(OpCodes.Ldc_I4_1), - - // StartingEventArgs ev = new(Player, bool) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(StartingEventArgs))[0]), - new(OpCodes.Dup), - - // Warhead.OnStarting(ev) - new(OpCodes.Call, Method(typeof(Warhead), nameof(Warhead.OnStarting))), - - // if (!ev.IsAllowed) - // goto cdcLabel; - new(OpCodes.Callvirt, PropertyGetter(typeof(StartingEventArgs), nameof(StartingEventArgs.IsAllowed))), - new(OpCodes.Brtrue, cdcLabel), - - // response = "Action prevented by a plugin." - new(OpCodes.Ldarg_3), - new(OpCodes.Ldstr, "Action prevented by a plugin."), - new(OpCodes.Stind_Ref), - - // return false - new(OpCodes.Ldc_I4_0), - new(OpCodes.Ret), - }; - - instructions.InsertRange(index, instructionsToInsert); - - instructions[index + instructionsToInsert.Length].WithLabels(cdcLabel); - } - } - - /// - /// Patches to add the - /// event when triggered by a command. - /// - [HarmonyPatch(typeof(DetonateCommand), nameof(DetonateCommand.Execute))] - internal static class StartingByDetonateCommand - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = 1; - int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ret) + offset; - - StartingByCommand.InsertInstructions(index, generator, ref newInstructions); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches to add the - /// event when triggered by a command. - /// - [HarmonyPatch(typeof(InstantCommand), nameof(InstantCommand.Execute))] - internal static class StartingByInstantCommand - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = 1; - int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ret) + offset; - - StartingByCommand.InsertInstructions(index, generator, ref newInstructions); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches to add the - /// event when triggered by a command. - /// - [HarmonyPatch(typeof(DetonationStartCommand), nameof(DetonationStartCommand.Execute))] - internal static class StartingByEventDetonateCommand - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = 1; - int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ret) + offset; - - StartingByCommand.InsertInstructions(index, generator, ref newInstructions); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches to add the - /// event when triggered by a command. - /// - [HarmonyPatch(typeof(DetonationInstantCommand), nameof(DetonationInstantCommand.Execute))] - internal static class StartingByEventInstantDetonateCommand - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = 1; - int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ret) + offset; - - StartingByCommand.InsertInstructions(index, generator, ref newInstructions); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Warhead/StartingByServer.cs b/Exiled.Events/Patches/Events/Warhead/StartingByServer.cs deleted file mode 100644 index d63211c839..0000000000 --- a/Exiled.Events/Patches/Events/Warhead/StartingByServer.cs +++ /dev/null @@ -1,77 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Events.Warhead -{ - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features; - using API.Features.Pools; - using Exiled.Events.EventArgs.Warhead; - - using HarmonyLib; - - using static HarmonyLib.AccessTools; - - using Warhead = Handlers.Warhead; - - /// - /// Patch the . - /// Adds the event. - /// - [HarmonyPatch(typeof(AlphaWarheadController), nameof(AlphaWarheadController.ServerUpdateAutonuke))] - internal static class StartingByServer - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - const int offset = -4; - int index = newInstructions.FindLastIndex( - instruction => instruction.Calls(Method(typeof(AlphaWarheadController), nameof(AlphaWarheadController.StartDetonation)))) + offset; - - Label returnLabel = generator.DefineLabel(); - - // StartingEventArgs ev = new(Server.Host, true); - // - // Handlers.Warhead.OnStarting(ev); - // - // if (!ev.IsAllowed) - // return; - newInstructions.InsertRange( - index, - new CodeInstruction[] - { - // Server.Host - new CodeInstruction(OpCodes.Call, PropertyGetter(typeof(Server), nameof(Server.Host))).MoveLabelsFrom(newInstructions[index]), - - // true - new(OpCodes.Ldc_I4_1), - - // StartingEventArgs ev = new(Player, bool) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(StartingEventArgs))[0]), - new(OpCodes.Dup), - - // Handlers.Warhead.OnStarting(ev); - new(OpCodes.Call, Method(typeof(Warhead), nameof(Warhead.OnStarting))), - - // if (!ev.IsAllowed) - // return; - new(OpCodes.Callvirt, PropertyGetter(typeof(StartingEventArgs), nameof(StartingEventArgs.IsAllowed))), - new(OpCodes.Brfalse_S, returnLabel), - }); - - newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Warhead/Stopping.cs b/Exiled.Events/Patches/Events/Warhead/Stopping.cs index 831faa5683..9999ee162a 100644 --- a/Exiled.Events/Patches/Events/Warhead/Stopping.cs +++ b/Exiled.Events/Patches/Events/Warhead/Stopping.cs @@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Warhead using API.Features; using API.Features.Pools; + using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Warhead; using HarmonyLib; @@ -24,6 +25,7 @@ namespace Exiled.Events.Patches.Events.Warhead /// Patches . /// Adds the event. ///
+ [EventPatch(typeof(Warhead), nameof(Warhead.Stopping))] [HarmonyPatch(typeof(AlphaWarheadController), nameof(AlphaWarheadController.CancelDetonation), typeof(ReferenceHub))] internal static class Stopping { diff --git a/Exiled.Events/Patches/Fixes/GrenadePropertiesFix.cs b/Exiled.Events/Patches/Fixes/GrenadePropertiesFix.cs index 7e60d40c30..f9fd0835d0 100644 --- a/Exiled.Events/Patches/Fixes/GrenadePropertiesFix.cs +++ b/Exiled.Events/Patches/Fixes/GrenadePropertiesFix.cs @@ -39,8 +39,8 @@ private static IEnumerable Transpiler(IEnumerable i.opcode == OpCodes.Stloc_0) + offset; + const int offset = 1; + int index = newInstructions.FindLastIndex(i => i.StoresField(Field(typeof(ThrowableItem), nameof(ThrowableItem._alreadyFired)))) + offset; newInstructions.RemoveRange(index, 11); diff --git a/Exiled.Events/Patches/Fixes/Scp1853Fix.cs b/Exiled.Events/Patches/Fixes/HurtingFix.cs similarity index 52% rename from Exiled.Events/Patches/Fixes/Scp1853Fix.cs rename to Exiled.Events/Patches/Fixes/HurtingFix.cs index e74613db20..746ac3bb45 100644 --- a/Exiled.Events/Patches/Fixes/Scp1853Fix.cs +++ b/Exiled.Events/Patches/Fixes/HurtingFix.cs @@ -1,11 +1,11 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // // ----------------------------------------------------------------------- -namespace Exiled.Events.Patches.Fixes +namespace Exiled.Events.Patches.Events.Player { using System.Collections.Generic; using System.Reflection.Emit; @@ -13,47 +13,47 @@ namespace Exiled.Events.Patches.Fixes using API.Features; using API.Features.Pools; - using CustomPlayerEffects; - - using Exiled.API.Enums; - using HarmonyLib; + using Mirror; + using static HarmonyLib.AccessTools; /// - /// Patch the . - /// Fix Spamming EnableEffect. + /// Patches . /// - [HarmonyPatch(typeof(Scp1853), nameof(Scp1853.OnEffectUpdate))] - internal static class Scp1853Fix + [HarmonyPatch(typeof(CustomNetworkManager), nameof(CustomNetworkManager.OnServerDisconnect), typeof(NetworkConnectionToClient))] + internal static class HurtingFix { private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - Label retLabel = generator.DefineLabel(); + LocalBuilder player = generator.DeclareLocal(typeof(Player)); + + Label skip = generator.DefineLabel(); - int offset = 1; - int index = newInstructions.FindLastIndex(i => i.opcode == OpCodes.Brfalse_S) + offset; + int offset = 2; + int index = newInstructions.FindIndex(i => i.Calls(Method(typeof(PlayerStatsSystem.PlayerStats), nameof(PlayerStatsSystem.PlayerStats.DealDamage)))) + offset; + + // Attach a skip label for skipping the DealDamge call + newInstructions[index].WithLabels(skip); + + offset = -8; + index += offset; newInstructions.InsertRange( index, new CodeInstruction[] { - // if (Player.Get(this.Hub).GetEffect(EffectType.Poisoned).IsEnabled) - // return; - new(OpCodes.Ldarg_0), - new(OpCodes.Callvirt, PropertyGetter(typeof(Scp1853), nameof(Scp1853.Hub))), + // if (!Player.Get(hub).IsAlive) + // skip; + new(OpCodes.Ldloc_1), new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), - new(OpCodes.Ldc_I4, (int)EffectType.Poisoned), - new(OpCodes.Callvirt, Method(typeof(Player), nameof(Player.GetEffect))), - new(OpCodes.Callvirt, PropertyGetter(typeof(StatusEffectBase), nameof(StatusEffectBase.IsEnabled))), - new(OpCodes.Brtrue_S, retLabel), + new(OpCodes.Callvirt, PropertyGetter(typeof(Player), nameof(Player.IsAlive))), + new(OpCodes.Brfalse_S, skip), }); - newInstructions[newInstructions.Count - 1].labels.Add(retLabel); - for (int z = 0; z < newInstructions.Count; z++) yield return newInstructions[z]; diff --git a/Exiled.Events/Patches/Fixes/LockerFixes.cs b/Exiled.Events/Patches/Fixes/LockerFixes.cs new file mode 100644 index 0000000000..ca5577a46c --- /dev/null +++ b/Exiled.Events/Patches/Fixes/LockerFixes.cs @@ -0,0 +1,65 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Fixes +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Features.Pools; + + using HarmonyLib; + + using InventorySystem.Items.Pickups; + + using MapGeneration.Distributors; + + using static HarmonyLib.AccessTools; + + /// + /// Fix for chamber lists weren't cleared. + /// + [HarmonyPatch(typeof(LockerChamber), nameof(LockerChamber.SetDoor))] + internal class LockerFixes + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + int offset = -1; + int index = newInstructions.FindIndex(i => i.LoadsField(Field(typeof(LockerChamber), nameof(LockerChamber._spawnOnFirstChamberOpening)))) + offset; + + newInstructions.InsertRange(index, new[] + { + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Call, Method(typeof(LockerFixes), nameof(LockerFixes.Hepler))), + new(OpCodes.Ret), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + + private static void Hepler(LockerChamber chamber) + { + chamber._content.Clear(); + + if (!chamber._spawnOnFirstChamberOpening) + return; + + foreach (ItemPickupBase ipb in chamber._toBeSpawned) + { + if (ipb != null) + ItemDistributor.SpawnPickup(ipb); + } + + chamber._toBeSpawned.Clear(); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Fixes/RoleChangedPatch.cs b/Exiled.Events/Patches/Fixes/RoleChangedPatch.cs index fb154d3184..166cc5d040 100644 --- a/Exiled.Events/Patches/Fixes/RoleChangedPatch.cs +++ b/Exiled.Events/Patches/Fixes/RoleChangedPatch.cs @@ -11,7 +11,6 @@ namespace Exiled.Events.Patches.Fixes using System.Reflection.Emit; using API.Features.Items; - using API.Features.Pools; using EventArgs.Player; diff --git a/Exiled.Events/Patches/Generic/AirlockListAdd.cs b/Exiled.Events/Patches/Generic/AirlockListAdd.cs new file mode 100644 index 0000000000..a51c79a391 --- /dev/null +++ b/Exiled.Events/Patches/Generic/AirlockListAdd.cs @@ -0,0 +1,39 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 +#pragma warning disable SA1402 + + using HarmonyLib; + using Interactables.Interobjects; + + /// + /// Patch for adding to list. + /// + [HarmonyPatch(typeof(AirlockController), nameof(AirlockController.Start))] + internal class AirlockListAdd + { + private static void Postfix(AirlockController __instance) + { + _ = new Exiled.API.Features.Doors.AirlockController(__instance); + } + } + + /// + /// Patch for removing to list. + /// + [HarmonyPatch(typeof(AirlockController), nameof(AirlockController.OnDestroy))] + internal class AirlockListRemove + { + private static void Postfix(AirlockController __instance) + { + Exiled.API.Features.Doors.AirlockController.BaseToExiledControllers.Remove(__instance); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/CameraList.cs b/Exiled.Events/Patches/Generic/CameraList.cs new file mode 100644 index 0000000000..fbcb76e863 --- /dev/null +++ b/Exiled.Events/Patches/Generic/CameraList.cs @@ -0,0 +1,108 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1402 + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features; + + using Exiled.API.Features.Pools; + + using HarmonyLib; + + using MapGeneration; + + using PlayerRoles.PlayableScps.Scp079; + using PlayerRoles.PlayableScps.Scp079.Cameras; + + using static HarmonyLib.AccessTools; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(Scp079InteractableBase), nameof(Scp079InteractableBase.OnRegistered))] + internal class CameraList + { + private static IEnumerable Transpiler(IEnumerable codeInstructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(codeInstructions); + + LocalBuilder cameraBase = generator.DeclareLocal(typeof(Scp079Camera)); + Label ret = generator.DefineLabel(); + + // if (this is Scp079Camera camera) + // Room.RoomIdentifierToRoom[Room].CamerasValue.Add(new Camera(camera)); + newInstructions.InsertRange( + newInstructions.Count - 1, + new CodeInstruction[] + { + new(OpCodes.Ldarg_0), + new(OpCodes.Isinst, typeof(Scp079Camera)), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, cameraBase.LocalIndex), + new(OpCodes.Brfalse_S, ret), + new(OpCodes.Ldsfld, Field(typeof(Room), nameof(Room.RoomIdentifierToRoom))), + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, PropertyGetter(typeof(Scp079Camera), nameof(Scp079Camera.Room))), + new(OpCodes.Callvirt, Method(typeof(Dictionary), "get_Item")), + new(OpCodes.Callvirt, PropertyGetter(typeof(Room), nameof(Room.CamerasValue))), + new(OpCodes.Ldloc_S, cameraBase.LocalIndex), + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(Camera))[0]), + new(OpCodes.Callvirt, Method(typeof(List), nameof(List.Add), new[] { typeof(Camera) })), + }); + + newInstructions[newInstructions.Count - 1].labels.Add(ret); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } + + /// + /// Patches . + /// + [HarmonyPatch(typeof(Scp079InteractableBase), nameof(Scp079InteractableBase.OnDestroy))] + internal class CameraListRemove + { + private static IEnumerable Transpiler(IEnumerable codeInstructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(codeInstructions); + + LocalBuilder cameraBase = generator.DeclareLocal(typeof(Scp079Camera)); + Label ret = generator.DefineLabel(); + + // if (__instance is Scp079Camera cameraBase) + // Camera.Camera079ToCamera.Remove(cameraBase); + newInstructions.InsertRange( + newInstructions.Count - 1, + new CodeInstruction[] + { + new(OpCodes.Ldarg_0), + new(OpCodes.Isinst, typeof(Scp079Camera)), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, cameraBase.LocalIndex), + new(OpCodes.Brfalse_S, ret), + new(OpCodes.Ldsfld, Field(typeof(Camera), nameof(Camera.Camera079ToCamera))), + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, Method(typeof(Dictionary), nameof(Dictionary.Remove), new[] { typeof(Scp079Camera) })), + new(OpCodes.Pop), + }); + + newInstructions[newInstructions.Count - 1].labels.Add(ret); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/DoorList.cs b/Exiled.Events/Patches/Generic/DoorList.cs new file mode 100644 index 0000000000..e6ab34e4ec --- /dev/null +++ b/Exiled.Events/Patches/Generic/DoorList.cs @@ -0,0 +1,119 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 +#pragma warning disable SA1402 + using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection.Emit; + + using API.Features; + + using Exiled.API.Features.Doors; + using Exiled.API.Features.Pools; + + using HarmonyLib; + + using Interactables.Interobjects.DoorUtils; + using MapGeneration; + + using UnityEngine; + + using static HarmonyLib.AccessTools; + + /// + /// Patches . + /// + // TODO: transpiler + [HarmonyPatch(typeof(DoorVariant), nameof(DoorVariant.RegisterRooms))] + internal class DoorList + { + private static bool Prefix(DoorVariant __instance) + { + /*EXILED*/ + if (__instance.Rooms != null) + return false; + /*EXILED*/ + + Vector3 position = __instance.transform.position; + int length = 0; + + for (int index = 0; index < 4; ++index) + { + Vector3Int coords = RoomIdUtils.PositionToCoords(position + DoorVariant.WorldDirections[index]); + + if (RoomIdentifier.RoomsByCoordinates.TryGetValue(coords, out RoomIdentifier key) && DoorVariant.DoorsByRoom.GetOrAdd(key, () => new HashSet()).Add(__instance)) + { + DoorVariant.RoomsNonAlloc[length] = key; + ++length; + } + } + + __instance.Rooms = new RoomIdentifier[length]; + Array.Copy(DoorVariant.RoomsNonAlloc, __instance.Rooms, length); + + /*EXILED*/ + List rooms = __instance.Rooms.Select(identifier => Room.RoomIdentifierToRoom[identifier]).ToList(); + + Door door = Door.Create(__instance, rooms); + + foreach (Room room in rooms) + room.DoorsValue.Add(door); + /*EXILED*/ + + return false; + } + } + + /// + /// Patches . + /// + [HarmonyPatch(typeof(DoorVariant), nameof(DoorVariant.OnDestroy))] + internal class DoorListRemove + { + private static IEnumerable Transpiler(IEnumerable codeInstructions) + { + List newInstructions = ListPool.Pool.Get(codeInstructions); + + // Door.DoorVariantToDoor.Remove(this) + newInstructions.InsertRange( + 0, + new CodeInstruction[] + { + new(OpCodes.Ldsfld, Field(typeof(Door), nameof(Door.DoorVariantToDoor))), + new(OpCodes.Ldarg_0), + new(OpCodes.Callvirt, Method(typeof(Dictionary), nameof(Dictionary.Remove), new[] { typeof(DoorVariant) })), + new(OpCodes.Pop), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } + + /// + /// Patches . + /// + [HarmonyPatch(typeof(Interactables.Interobjects.CheckpointDoor), nameof(Interactables.Interobjects.CheckpointDoor.Start))] + internal class CheckpointDoorsFix + { + private static void Postfix(Interactables.Interobjects.CheckpointDoor __instance) + { + CheckpointDoor checkpoint = Door.Get(__instance).Cast(); + foreach (DoorVariant door in __instance.SubDoors) + { + door.RegisterRooms(); + checkpoint.SubDoorsValue.Add(Door.Get(door).Cast()); + } + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/GeneratorListRemove.cs b/Exiled.Events/Patches/Generic/GeneratorList.cs similarity index 62% rename from Exiled.Events/Patches/Generic/GeneratorListRemove.cs rename to Exiled.Events/Patches/Generic/GeneratorList.cs index 7699961e0d..eec846d6c3 100644 --- a/Exiled.Events/Patches/Generic/GeneratorListRemove.cs +++ b/Exiled.Events/Patches/Generic/GeneratorList.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -7,6 +7,7 @@ namespace Exiled.Events.Patches.Generic { +#pragma warning disable SA1402 using System.Collections.Generic; using System.Reflection.Emit; @@ -19,6 +20,33 @@ namespace Exiled.Events.Patches.Generic using static HarmonyLib.AccessTools; + /// + /// Patches . + /// + [HarmonyPatch(typeof(Scp079Generator), nameof(Scp079Generator.Start))] + internal class GeneratorList + { + private static IEnumerable Transpiler(IEnumerable codeInstructions) + { + List newInstructions = ListPool.Pool.Get(codeInstructions); + + // new Generator(this) + newInstructions.InsertRange( + 0, + new CodeInstruction[] + { + new(OpCodes.Ldarg_0), + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(Generator))[0]), + new(OpCodes.Pop), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } + /// /// Patches . /// diff --git a/Exiled.Events/Patches/Generic/GhostModePatch.cs b/Exiled.Events/Patches/Generic/GhostModePatch.cs index 31a2844072..51401de0da 100644 --- a/Exiled.Events/Patches/Generic/GhostModePatch.cs +++ b/Exiled.Events/Patches/Generic/GhostModePatch.cs @@ -22,7 +22,7 @@ namespace Exiled.Events.Patches.Generic using static HarmonyLib.AccessTools; /// - /// Patches to prevent the server from being listed. + /// Patches to add and functional. /// [HarmonyPatch(typeof(FpcServerPositionDistributor), nameof(FpcServerPositionDistributor.WriteAll))] internal class GhostModePatch diff --git a/Exiled.Events/Patches/Generic/HazardList.cs b/Exiled.Events/Patches/Generic/HazardList.cs new file mode 100644 index 0000000000..6ee854655d --- /dev/null +++ b/Exiled.Events/Patches/Generic/HazardList.cs @@ -0,0 +1,30 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 + + using Exiled.API.Features.Hazards; + using HarmonyLib; + using Hazards; + + /// + /// Patch for controlling hazard list. + /// + [HarmonyPatch] + internal class HazardList + { + [HarmonyPatch(typeof(EnvironmentalHazard), nameof(EnvironmentalHazard.Start))] + [HarmonyPostfix] + private static void Adding(EnvironmentalHazard __instance) => _ = Hazard.Get(__instance); + + [HarmonyPatch(typeof(EnvironmentalHazard), nameof(EnvironmentalHazard.OnDestroy))] + [HarmonyPostfix] + private static void Removing(EnvironmentalHazard __instance) => Hazard.EnvironmentalHazardToHazard.Remove(__instance); + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs b/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs index f500ed8edd..99895c5a18 100644 --- a/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs +++ b/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs @@ -8,7 +8,6 @@ namespace Exiled.Events.Patches.Generic { #pragma warning disable SA1402 -#pragma warning disable SA1313 using System; using System.Collections.Generic; using System.Reflection.Emit; @@ -28,8 +27,6 @@ namespace Exiled.Events.Patches.Generic using static HarmonyLib.AccessTools; - using ExiledEvents = Exiled.Events.Events; - /// /// Checks friendly fire rules. /// @@ -147,24 +144,37 @@ public static bool CheckFriendlyFirePlayerRules(ReferenceHub attackerHub, Refere [HarmonyPatch(typeof(HitboxIdentity), nameof(HitboxIdentity.CheckFriendlyFire), typeof(ReferenceHub), typeof(ReferenceHub), typeof(bool))] internal static class HitboxIdentityCheckFriendlyFire { - private static bool Prefix(ReferenceHub attacker, ReferenceHub victim, ref bool __result) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - try - { - Log.Debug($"Hitbox patch {Server.FriendlyFire} || {IndividualFriendlyFire.CheckFriendlyFirePlayerRules(attacker, victim, out _)}"); - bool currentResult = IndividualFriendlyFire.CheckFriendlyFirePlayerHitbox(attacker, victim); + List newInstructions = ListPool.Pool.Get(instructions); - if (!currentResult) - return true; + Label jmp = generator.DefineLabel(); - __result = currentResult; - return false; - } - catch (Exception exception) - { - Log.Error($"{exception}"); - return true; - } + // CheckFriendlyFirePlayer(this.PreviousOwner.Hub, referenceHub) + newInstructions.InsertRange( + 0, + new CodeInstruction[] + { + // CheckFriendlyFirePlayerHitbox(attacker, victim); + new(OpCodes.Ldarg_0), + new(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(IndividualFriendlyFire), nameof(IndividualFriendlyFire.CheckFriendlyFirePlayerHitbox))), + + // goto base game logic if false + new(OpCodes.Brfalse_S, jmp), + + // Return true + new(OpCodes.Ldc_I4_1), + new(OpCodes.Ret), + + // jmp + new CodeInstruction(OpCodes.Nop).WithLabels(jmp), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); } } @@ -250,46 +260,4 @@ private static IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } } - - /// - /// Patches . - /// - [HarmonyPatch(typeof(FlashbangGrenade), nameof(FlashbangGrenade.PlayExplosionEffects))] - internal static class FlashbangGrenadePlayExplosionEffectsPatch - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - // Replace the original friendly fire check with the Exiled one - const int offset = -7; - const int instructionsToRemove = 7; - int index = newInstructions.FindLastIndex(code => code.opcode == OpCodes.Brfalse_S) + offset; - - // HitboxIdentity.CheckFriendlyFire(RoleTypeId, RoleTypeId, false) - newInstructions.RemoveRange(index, instructionsToRemove); - - // CheckFriendlyFirePlayer(this.PreviousOwner.Hub, referenceHub) - newInstructions.InsertRange( - index, - new CodeInstruction[] - { - // this.PreviousOwner.Hub - new(OpCodes.Ldarg_0), - new(OpCodes.Ldflda, Field(typeof(FlashbangGrenade), nameof(FlashbangGrenade.PreviousOwner))), - new(OpCodes.Ldfld, Field(typeof(Footprint), nameof(Footprint.Hub))), - - // referenceHub - new(OpCodes.Ldloc_2), - - // CheckFriendlyFirePlayer(this.PreviousOwner.Hub, referenceHub) - new(OpCodes.Call, Method(typeof(IndividualFriendlyFire), nameof(IndividualFriendlyFire.CheckFriendlyFirePlayer))), - }); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/InventoryControlPatch.cs b/Exiled.Events/Patches/Generic/InventoryControlPatch.cs index 6c74c63a66..08cdb27273 100644 --- a/Exiled.Events/Patches/Generic/InventoryControlPatch.cs +++ b/Exiled.Events/Patches/Generic/InventoryControlPatch.cs @@ -16,7 +16,7 @@ namespace Exiled.Events.Patches.Generic using API.Features; using API.Features.Items; using API.Features.Pools; - + using Exiled.API.Features.Pickups; using HarmonyLib; using InventorySystem; @@ -76,10 +76,11 @@ private static IEnumerable Transpiler( private static void AddItem(Player player, ItemBase itemBase, ItemPickupBase itemPickupBase) { Item item = Item.Get(itemBase); - - if (itemPickupBase != null) - item.Scale = itemPickupBase.transform.localScale; - + Pickup pickup = Pickup.Get(itemPickupBase); + /* + if (pickup?.IsLoaded ?? false) + pickup.GetPickupInfo(item); + */ player?.ItemsValue.Add(item); } } diff --git a/Exiled.Events/Patches/Generic/LiftList.cs b/Exiled.Events/Patches/Generic/LiftList.cs new file mode 100644 index 0000000000..f1f9a058b9 --- /dev/null +++ b/Exiled.Events/Patches/Generic/LiftList.cs @@ -0,0 +1,33 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ + using System.Collections.Generic; + + using API.Features; + + using HarmonyLib; + using Interactables.Interobjects; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(ElevatorManager), nameof(ElevatorManager.RefreshChambers))] + internal class LiftList + { + private static void Postfix() + { + Lift.ElevatorChamberToLift.Clear(); + + foreach (KeyValuePair lift in ElevatorManager.SpawnedChambers) + { + _ = new Lift(lift.Value); + } + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/GeneratorListAdd.cs b/Exiled.Events/Patches/Generic/LockerList.cs similarity index 72% rename from Exiled.Events/Patches/Generic/GeneratorListAdd.cs rename to Exiled.Events/Patches/Generic/LockerList.cs index f47e483330..26b0732abe 100644 --- a/Exiled.Events/Patches/Generic/GeneratorListAdd.cs +++ b/Exiled.Events/Patches/Generic/LockerList.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright (c) Exiled Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. // @@ -20,23 +20,23 @@ namespace Exiled.Events.Patches.Generic using static HarmonyLib.AccessTools; /// - /// Patches . + /// Patches . /// - [HarmonyPatch(typeof(Scp079Generator), nameof(Scp079Generator.Start))] - internal class GeneratorListAdd + [HarmonyPatch(typeof(Locker), nameof(Locker.Start))] + internal class LockerList { private static IEnumerable Transpiler(IEnumerable codeInstructions) { List newInstructions = ListPool.Pool.Get(codeInstructions); - // new Generator(this) + // Map.LockersValue.Add(this); newInstructions.InsertRange( 0, new CodeInstruction[] { + new(OpCodes.Ldsfld, Field(typeof(Map), nameof(Map.LockersValue))), new(OpCodes.Ldarg_0), - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(Generator))[0]), - new(OpCodes.Pop), + new(OpCodes.Callvirt, Method(typeof(List), nameof(List.Add), new[] { typeof(Locker) })), }); for (int z = 0; z < newInstructions.Count; z++) diff --git a/Exiled.Events/Patches/Generic/PickupControlPatch.cs b/Exiled.Events/Patches/Generic/PickupControlPatch.cs index d982b66f78..cbbab4b28c 100644 --- a/Exiled.Events/Patches/Generic/PickupControlPatch.cs +++ b/Exiled.Events/Patches/Generic/PickupControlPatch.cs @@ -7,7 +7,7 @@ namespace Exiled.Events.Patches.Generic { -#pragma warning disable SA1402 + using System; using System.Collections.Generic; using System.Reflection.Emit; @@ -23,14 +23,15 @@ namespace Exiled.Events.Patches.Generic using MapGeneration.Distributors; - using static HarmonyLib.AccessTools; + using UnityEngine; - using Inventory = InventorySystem.Inventory; + using static HarmonyLib.AccessTools; +#pragma warning disable SA1402 /// File may only contain a single type. /// - /// Patches to save scale for pickups and control property. + /// Patches to save scale for pickups and control property. /// - [HarmonyPatch(typeof(InventoryExtensions), nameof(InventoryExtensions.ServerCreatePickup))] + [HarmonyPatch(typeof(InventoryExtensions), nameof(InventoryExtensions.ServerCreatePickup), typeof(ItemBase), typeof(PickupSyncInfo), typeof(Vector3), typeof(Quaternion), typeof(bool), typeof(Action))] internal static class PickupControlPatch { private static IEnumerable Transpiler( @@ -40,25 +41,24 @@ private static IEnumerable Transpiler( List newInstructions = ListPool.Pool.Get(instructions); const int offset = 0; - int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ldarg_3) + offset; + int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ldarg_S) + offset; newInstructions.InsertRange(index, new CodeInstruction[] { // pickup = Pickup.Get(pickupBase); new(OpCodes.Ldloc_0), new(OpCodes.Call, Method(typeof(Pickup), nameof(Pickup.Get), new[] { typeof(ItemPickupBase) })), - new(OpCodes.Dup), + /* // Item.Get(itemBase); - new(OpCodes.Ldarg_1), + new(OpCodes.Ldarg_0), new(OpCodes.Call, Method(typeof(Item), nameof(Item.Get), new[] { typeof(ItemBase) })), - // pickup.Scale = item.Scale - new(OpCodes.Callvirt, PropertyGetter(typeof(Item), nameof(Item.Scale))), - new(OpCodes.Callvirt, PropertySetter(typeof(Pickup), nameof(Pickup.Scale))), + // pickup.GetItemInfo(item); + new(OpCodes.Callvirt, Method(typeof(Pickup), nameof(Pickup.GetItemInfo))),*/ // pickup.IsSpawned = spawn - new(OpCodes.Ldarg_3), + new(OpCodes.Ldarg_S, 4), new(OpCodes.Callvirt, PropertySetter(typeof(Pickup), nameof(Pickup.IsSpawned))), }); diff --git a/Exiled.Events/Patches/Generic/PickupListRemove.cs b/Exiled.Events/Patches/Generic/PickupListRemove.cs deleted file mode 100644 index fb6e8e99d9..0000000000 --- a/Exiled.Events/Patches/Generic/PickupListRemove.cs +++ /dev/null @@ -1,126 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Copyright (c) Exiled Team. All rights reserved. -// Licensed under the CC BY-SA 3.0 license. -// -// ----------------------------------------------------------------------- - -namespace Exiled.Events.Patches.Generic -{ -#pragma warning disable SA1402 - using System.Collections.Generic; - using System.Reflection.Emit; - - using API.Features.Pickups; - using API.Features.Pools; - - using HarmonyLib; - - using InventorySystem.Items.Pickups; - using InventorySystem.Items.ThrowableProjectiles; - - using static HarmonyLib.AccessTools; - - /// - /// Patches . - /// - [HarmonyPatch(typeof(ItemPickupBase), nameof(ItemPickupBase.OnDestroy))] - internal static class PickupListRemove - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - newInstructions.InsertRange(0, new[] - { - // _ = Pickup.BaseToPickup.Remove(this); - new CodeInstruction(OpCodes.Ldsfld, Field(typeof(Pickup), nameof(Pickup.BaseToPickup))), - new(OpCodes.Ldarg_0), - new(OpCodes.Callvirt, Method(typeof(Dictionary), nameof(Dictionary.Remove), new[] { typeof(ItemPickupBase) })), - new(OpCodes.Pop), - }); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches for fixing cringe NW code :). - /// - [HarmonyPatch(typeof(EffectGrenade), nameof(EffectGrenade.OnDestroy))] - internal static class EffectGrenadesListRemove - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - // remove all code and save only base.OnDestroy() - yield return new CodeInstruction(OpCodes.Ldarg_0); - yield return new(OpCodes.Call, Method(typeof(ItemPickupBase), nameof(ItemPickupBase.OnDestroy))); - yield return new(OpCodes.Ret); - } - } - - /// - /// Patches for fixing cringe NW code :). - /// - [HarmonyPatch(typeof(EffectGrenade), nameof(EffectGrenade.ServerFuseEnd))] - internal static class ServerFuseEndListRemove - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - Label skip = generator.DefineLabel(); - - // PlayExplosionEffects() - newInstructions.InsertRange(0, new[] - { - new CodeInstruction(OpCodes.Ldarg_0), - new(OpCodes.Callvirt, Method(typeof(EffectGrenade), nameof(EffectGrenade.PlayExplosionEffects))), - }); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } - - /// - /// Patches for fixing cringe NW code :). - /// - [HarmonyPatch(typeof(Scp2176Projectile), nameof(Scp2176Projectile.ServerFuseEnd))] - internal static class Scp2176ListRemove - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - int offset = -1; - int index = newInstructions.FindIndex(i => i.Calls(Method(typeof(Scp2176Projectile), nameof(Scp2176Projectile.ServerShatter)))) + offset; - - offset = -1; - int index2 = newInstructions.FindIndex(i => i.Calls(Method(typeof(EffectGrenade), nameof(EffectGrenade.ServerFuseEnd)))) + offset; - - // fix labels - newInstructions[index].MoveLabelsFrom(newInstructions[index2]); - - // remove EffectGrenade::ServerFuseEnd at start - newInstructions.RemoveRange(index2, 2); - - // insert EffectGrenade::ServerFuseEnd at the ends - newInstructions.InsertRange(newInstructions.Count - 1, new[] - { - new(OpCodes.Ldarg_0), - new CodeInstruction(OpCodes.Call, Method(typeof(EffectGrenade), nameof(EffectGrenade.ServerFuseEnd))), - }); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -} diff --git a/Exiled.Events/Patches/Generic/RoomList.cs b/Exiled.Events/Patches/Generic/RoomList.cs new file mode 100644 index 0000000000..5e592a8f65 --- /dev/null +++ b/Exiled.Events/Patches/Generic/RoomList.cs @@ -0,0 +1,82 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 +#pragma warning disable SA1402 + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features; + + using Exiled.API.Features.Pools; + + using HarmonyLib; + + using MapGeneration; + using MapGeneration.Distributors; + + using UnityEngine; + + using static HarmonyLib.AccessTools; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(RoomIdentifier), nameof(RoomIdentifier.TryAssignId))] + internal class RoomList + { + private static IEnumerable Transpiler(IEnumerable codeInstructions) + { + List newInstructions = ListPool.Pool.Get(codeInstructions); + + int offset = -3; + int index = newInstructions.FindIndex(i => i.Calls(Method(typeof(RoomIdUtils), nameof(RoomIdUtils.PositionToCoords)))) + offset; + + // Room.CreateComponent(gameObject); + newInstructions.InsertRange( + index, + new CodeInstruction[] + { + new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), + new(OpCodes.Callvirt, PropertyGetter(typeof(Component), nameof(Component.gameObject))), + new(OpCodes.Call, Method(typeof(Room), nameof(Room.CreateComponent))), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } + + /// + /// Patches . + /// + [HarmonyPatch(typeof(RoomIdentifier), nameof(RoomIdentifier.OnDestroy))] + internal class RoomListRemove + { + private static void Postfix(RoomIdentifier __instance) + { + if (!Room.RoomIdentifierToRoom.TryGetValue(__instance, out Room room)) + { + return; + } + + room.WindowsValue.ForEach(window => Window.BreakableWindowToWindow.Remove(window.Base)); + + room.WindowsValue.Clear(); + room.DoorsValue.Clear(); + room.CamerasValue.Clear(); + room.SpeakersValue.Clear(); + room.RoomLightControllersValue.Clear(); + + Room.RoomIdentifierToRoom.Remove(__instance); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/Scp079Scan.cs b/Exiled.Events/Patches/Generic/Scp079Scan.cs new file mode 100644 index 0000000000..760a695c1c --- /dev/null +++ b/Exiled.Events/Patches/Generic/Scp079Scan.cs @@ -0,0 +1,77 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using API.Features; + using API.Features.Pools; + + using HarmonyLib; + + using PlayerRoles; + using PlayerRoles.PlayableScps.Scp079; + + using static HarmonyLib.AccessTools; + + using ExiledEvents = Exiled.Events.Events; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(Scp079ScannerTracker), nameof(Scp079ScannerTracker.AddTarget))] + internal static class Scp079Scan + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + + Label returnLabel = generator.DefineLabel(); + Label skip = generator.DefineLabel(); + Label continueLabel = generator.DefineLabel(); + + newInstructions[0].labels.Add(continueLabel); + + // if ((referenceHub.roleManager.CurrentRole.RoleTypeId == RoleTypeId.Tutorial && ExiledEvents.Instance.Config.TutorialNotAffectedByScp079Scan) || Scp079Role.TurnedPlayers.Contains(Player.Get(referenceHub))) + // return; + newInstructions.InsertRange( + 0, + new[] + { + // if (referenceHub.roleManager.CurrentRole.RoleTypeId == RoleTypeId.Tutorial) + new(OpCodes.Ldarg_1), + new(OpCodes.Ldfld, Field(typeof(ReferenceHub), nameof(ReferenceHub.roleManager))), + new(OpCodes.Callvirt, PropertyGetter(typeof(PlayerRoleManager), nameof(PlayerRoleManager.CurrentRole))), + new(OpCodes.Callvirt, PropertyGetter(typeof(PlayerRoleBase), nameof(PlayerRoleBase.RoleTypeId))), + new(OpCodes.Ldc_I4_S, (sbyte)RoleTypeId.Tutorial), + new(OpCodes.Bne_Un_S, skip), + + // if (!ExiledEvents.Instance.Config.TutorialNotAffectedByScp079Scan) + new(OpCodes.Call, PropertyGetter(typeof(ExiledEvents), nameof(ExiledEvents.Instance))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Plugin), nameof(Plugin.Config))), + new(OpCodes.Callvirt, PropertyGetter(typeof(Config), nameof(Config.TutorialNotAffectedByScp079Scan))), + new(OpCodes.Brfalse_S, returnLabel), + + // if (Scp079Role.TurnedPlayers.Contains(Player.Get(referenceHub))) + new CodeInstruction(OpCodes.Call, PropertyGetter(typeof(API.Features.Roles.Scp079Role), nameof(API.Features.Roles.Scp079Role.TurnedPlayers))).WithLabels(skip), + new (OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })), + new(OpCodes.Callvirt, Method(typeof(HashSet), nameof(HashSet.Contains))), + new(OpCodes.Brtrue_S, returnLabel), + }); + + newInstructions[newInstructions.Count - 1].WithLabels(returnLabel); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/SpeakerInRoom.cs b/Exiled.Events/Patches/Generic/SpeakerInRoom.cs new file mode 100644 index 0000000000..d9febe29bd --- /dev/null +++ b/Exiled.Events/Patches/Generic/SpeakerInRoom.cs @@ -0,0 +1,28 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 + using API.Features; + + using HarmonyLib; + + using PlayerRoles.PlayableScps.Scp079; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(Scp079Speaker), nameof(Scp079Speaker.OnRegistered))] + internal class SpeakerInRoom + { + private static void Postfix(Scp079Speaker __instance) + { + Room.RoomIdentifierToRoom[__instance.Room].SpeakersValue.Add(__instance); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/TeleportList.cs b/Exiled.Events/Patches/Generic/TeleportList.cs new file mode 100644 index 0000000000..3b1627f1cf --- /dev/null +++ b/Exiled.Events/Patches/Generic/TeleportList.cs @@ -0,0 +1,27 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ +#pragma warning disable SA1313 + using API.Features; + + using HarmonyLib; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(PocketDimensionGenerator), nameof(PocketDimensionGenerator.PrepTeleports))] + internal class TeleportList + { + private static void Postfix(ref PocketDimensionTeleport[] __result) + { + Map.TeleportsValue.Clear(); + Map.TeleportsValue.AddRange(__result); + } + } +} \ No newline at end of file diff --git a/Exiled.Events/Patches/Generic/TeslaList.cs b/Exiled.Events/Patches/Generic/TeslaList.cs new file mode 100644 index 0000000000..106ab1d4ad --- /dev/null +++ b/Exiled.Events/Patches/Generic/TeslaList.cs @@ -0,0 +1,25 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Generic +{ + using API.Features; + + using HarmonyLib; + + /// + /// Patches . + /// + [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.Start))] + internal class TeslaList + { + private static void Postfix() + { + TeslaGate.BaseTeslaGateToTeslaGate.Clear(); + } + } +} \ No newline at end of file diff --git a/Exiled.Example/Events/MapHandler.cs b/Exiled.Example/Events/MapHandler.cs index 30ef2472e5..231fe2f838 100644 --- a/Exiled.Example/Events/MapHandler.cs +++ b/Exiled.Example/Events/MapHandler.cs @@ -23,8 +23,8 @@ public void OnExplodingGrenade(ExplodingGrenadeEventArgs ev) Log.Info($"A grenade thrown by {ev.Player.Nickname} is exploding: {ev.Projectile.Type}\n[Targets]\n\n{string.Join("\n", ev.TargetsToAffect.Select(player => $"[{player.Nickname}]"))}"); } - /// - public void OnGeneratorActivated(GeneratorActivatedEventArgs ev) + /// + public void OnGeneratorActivated(GeneratorActivatingEventArgs ev) { Log.Info($"A generator has been activated in {ev.Generator.Room.Type}!"); } diff --git a/Exiled.Example/Events/PlayerHandler.cs b/Exiled.Example/Events/PlayerHandler.cs index e291447453..7bfbd451f2 100644 --- a/Exiled.Example/Events/PlayerHandler.cs +++ b/Exiled.Example/Events/PlayerHandler.cs @@ -68,7 +68,7 @@ public void OnChangingItem(ChangingItemEventArgs ev) } }); - Log.Info($"{ev.Player.Nickname} is changing his {(ev.Player?.CurrentItem is null ? "NONE" : ev.Player?.CurrentItem?.Type.ToString())} item to {(ev.NewItem is null ? "NONE" : ev.NewItem.Type.ToString())}!"); + Log.Info($"{ev.Player.Nickname} is changing his {(ev.Player?.CurrentItem is null ? "NONE" : ev.Player?.CurrentItem?.Type.ToString())} item to {(ev.Item is null ? "NONE" : ev.Item.Type.ToString())}!"); } /// diff --git a/Exiled.Example/Example.cs b/Exiled.Example/Example.cs index b57f9eb05c..abbb0d7ab1 100644 --- a/Exiled.Example/Example.cs +++ b/Exiled.Example/Example.cs @@ -103,7 +103,7 @@ private void RegisterEvents() Exiled.Events.Handlers.Scp914.UpgradingPlayer += playerHandler.OnUpgradingPlayer; Exiled.Events.Handlers.Map.ExplodingGrenade += mapHandler.OnExplodingGrenade; - Exiled.Events.Handlers.Map.GeneratorActivated += mapHandler.OnGeneratorActivated; + Exiled.Events.Handlers.Map.GeneratorActivating += mapHandler.OnGeneratorActivated; Exiled.Events.Handlers.Item.ChangingAmmo += itemHandler.OnChangingAmmo; Exiled.Events.Handlers.Item.ChangingAttachments += itemHandler.OnChangingAttachments; @@ -143,7 +143,7 @@ private void UnregisterEvents() Exiled.Events.Handlers.Scp914.ChangingKnobSetting -= playerHandler.OnChangingKnobSetting; Exiled.Events.Handlers.Map.ExplodingGrenade -= mapHandler.OnExplodingGrenade; - Exiled.Events.Handlers.Map.GeneratorActivated -= mapHandler.OnGeneratorActivated; + Exiled.Events.Handlers.Map.GeneratorActivating -= mapHandler.OnGeneratorActivated; Exiled.Events.Handlers.Item.ChangingAmmo -= itemHandler.OnChangingAmmo; Exiled.Events.Handlers.Item.ChangingAttachments -= itemHandler.OnChangingAttachments; diff --git a/Exiled.Example/Exiled.Example.csproj b/Exiled.Example/Exiled.Example.csproj index 6f5a6c92fd..9ad073fe0f 100644 --- a/Exiled.Example/Exiled.Example.csproj +++ b/Exiled.Example/Exiled.Example.csproj @@ -18,7 +18,6 @@ - diff --git a/Exiled.Installer/CommandSettings.cs b/Exiled.Installer/CommandSettings.cs index 2258ce3d02..c4e4553e16 100644 --- a/Exiled.Installer/CommandSettings.cs +++ b/Exiled.Installer/CommandSettings.cs @@ -93,6 +93,11 @@ internal sealed class CommandSettings "Includes pre-releases") { IsRequired = false }, + new Option( + "--target-port", + "Target port for ExiledLoader installation") + { IsRequired = false }, + new Option( "--target-version", "Target version for installation") @@ -123,6 +128,7 @@ internal sealed class CommandSettings #nullable restore public bool PreReleases { get; set; } + public string? TargetPort { get; set; } public string? TargetVersion { get; set; } diff --git a/Exiled.Installer/Exiled.Installer.csproj b/Exiled.Installer/Exiled.Installer.csproj index 0e52e66d69..3d4965efe5 100644 --- a/Exiled.Installer/Exiled.Installer.csproj +++ b/Exiled.Installer/Exiled.Installer.csproj @@ -3,7 +3,7 @@ Exe x64 - netcoreapp3.1 + net6.0 9.0 enable linux-x64;win-x64 @@ -17,11 +17,12 @@ bin\$(Configuration)\ Exiled online installer - 3.2.3 ..\assets\Exiled_Icon.ico $(NoWarn);CS1591 Debug;Release;Installer AnyCPU + 4.0.0 + 4.0.0 diff --git a/Exiled.Installer/Program.cs b/Exiled.Installer/Program.cs index 00deea3242..8446bedc28 100644 --- a/Exiled.Installer/Program.cs +++ b/Exiled.Installer/Program.cs @@ -63,6 +63,7 @@ private async static Task Main(string[] args) internal async static Task MainSafe(CommandSettings args) { + bool error = false; try { Console.WriteLine(Header); @@ -94,17 +95,12 @@ internal async static Task MainSafe(CommandSettings args) IEnumerable releases = await GetReleases().ConfigureAwait(false); Console.WriteLine(Resources.Program_MainSafe_Searching_for_the_latest_release_that_matches_the_parameters___); - if (!TryFindRelease(args, releases, out Release? targetRelease)) - { - Console.WriteLine(Resources.Program_MainSafe_____RELEASES____); - Console.WriteLine(string.Join(Environment.NewLine, releases.Select(FormatRelease))); - throw new InvalidOperationException("Couldn't find release"); - } + Release targetRelease = FindRelease(args, releases); Console.WriteLine(Resources.Program_MainSafe_Release_found_); Console.WriteLine(FormatRelease(targetRelease!)); - ReleaseAsset exiledAsset = targetRelease!.Assets.FirstOrDefault(a => a.Name.Equals(ExiledAssetName, StringComparison.OrdinalIgnoreCase)); + ReleaseAsset? exiledAsset = targetRelease!.Assets.FirstOrDefault(a => a.Name.Equals(ExiledAssetName, StringComparison.OrdinalIgnoreCase)); if (exiledAsset is null) { Console.WriteLine(Resources.Program_MainSafe_____ASSETS____); @@ -145,7 +141,7 @@ internal async static Task MainSafe(CommandSettings args) } if (args.Exit) - Environment.Exit(0); + Environment.Exit(error ? 1 : 0); } private async static Task> GetReleases() @@ -180,6 +176,11 @@ private static string FormatRelease(Release r, bool includeAssets) private static void ProcessTarEntry(CommandSettings args, TarInputStream tarInputStream, TarEntry entry) { + if (entry.Name.Contains("global") && args.TargetPort is not null) + { + entry.Name = entry.Name.Replace("global", args.TargetPort); + } + if (entry.IsDirectory) { TarEntry[] entries = entry.GetDirectoryEntries(); @@ -276,24 +277,23 @@ static PathResolution TryParse(string s) return PathResolution.Undefined; } - private static bool TryFindRelease(CommandSettings args, IEnumerable releases, out Release? release) + private static Release FindRelease(CommandSettings args, IEnumerable releases) { Console.WriteLine(Resources.Program_TryFindRelease_Trying_to_find_release__); - Version targetVersion = args.TargetVersion is not null ? new Version(args.TargetVersion) : VersionLimit; + Version targetVersion = args.TargetVersion is not null ? new Version(args.TargetVersion) : new Version(releases.First().TagName); foreach (Release r in releases) { - release = r; + if (targetVersion != new Version(r.TagName)) + continue; - if (targetVersion == new Version(r.TagName)) - return true; + if (targetVersion.IsPreRelease && !args.PreReleases) + continue; - if ((r.Prerelease && args.PreReleases) || !r.Prerelease) - return true; + return r; } - release = null; - return false; + return releases.First(); } } } \ No newline at end of file diff --git a/Exiled.Installer/Properties/Resources.Designer.cs b/Exiled.Installer/Properties/Resources.Designer.cs index 5246080851..e382401b53 100644 --- a/Exiled.Installer/Properties/Resources.Designer.cs +++ b/Exiled.Installer/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace Exiled.Installer.Properties { using System; - - + + /// /// Classe di risorse fortemente tipizzata per la ricerca di stringhe localizzate e così via. /// @@ -23,15 +23,15 @@ namespace Exiled.Installer.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Restituisce l'istanza di ResourceManager nella cache utilizzata da questa classe. /// @@ -45,7 +45,7 @@ internal Resources() { return resourceMan; } } - + /// /// Esegue l'override della proprietà CurrentUICulture del thread corrente per tutte le /// ricerche di risorse eseguite utilizzando questa classe di risorse fortemente tipizzata. @@ -59,7 +59,7 @@ internal Resources() { resourceCulture = value; } } - + /// /// Cerca una stringa localizzata simile a EXILED\:EXILED ///SCP Secret Laboratory\:ABSOLUTE @@ -70,7 +70,7 @@ internal static string Markup { return ResourceManager.GetString("Markup", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Does it exist? - {0}. /// @@ -79,7 +79,7 @@ internal static string Program_EnsureDirExists_Does_it_exist_____0_ { return ResourceManager.GetString("Program_EnsureDirExists_Does_it_exist_____0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Ensuring directory path: {0}. /// @@ -88,7 +88,7 @@ internal static string Program_EnsureDirExists_Ensuring_directory_path___0_ { return ResourceManager.GetString("Program_EnsureDirExists_Ensuring_directory_path___0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a An exception occurred while trying to extract a file. /// @@ -97,7 +97,7 @@ internal static string Program_ExtractEntry_An_exception_occurred_while_trying_t return ResourceManager.GetString("Program_ExtractEntry_An_exception_occurred_while_trying_to_extract_a_file", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Extracting '{0}' into '{1}'.... /// @@ -106,7 +106,7 @@ internal static string Program_ExtractEntry_Extracting___0___into___1_____ { return ResourceManager.GetString("Program_ExtractEntry_Extracting___0___into___1_____", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a --- ASSETS ---. /// @@ -115,7 +115,7 @@ internal static string Program_MainSafe_____ASSETS____ { return ResourceManager.GetString("Program_MainSafe_____ASSETS____", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a --- AVAILABLE VERSIONS ---. /// @@ -124,16 +124,7 @@ internal static string Program_MainSafe_____AVAILABLE_VERSIONS____ { return ResourceManager.GetString("Program_MainSafe_____AVAILABLE_VERSIONS____", resourceCulture); } } - - /// - /// Cerca una stringa localizzata simile a --- RELEASES ---. - /// - internal static string Program_MainSafe_____RELEASES____ { - get { - return ResourceManager.GetString("Program_MainSafe_____RELEASES____", resourceCulture); - } - } - + /// /// Cerca una stringa localizzata simile a AppData folder: {0}. /// @@ -142,7 +133,7 @@ internal static string Program_MainSafe_AppData_folder___0_ { return ResourceManager.GetString("Program_MainSafe_AppData_folder___0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Asset found!. /// @@ -151,16 +142,7 @@ internal static string Program_MainSafe_Asset_found_ { return ResourceManager.GetString("Program_MainSafe_Asset_found_", resourceCulture); } } - - /// - /// Cerca una stringa localizzata simile a Couldn't find '{0}' in '{1}'. - /// - internal static string Program_MainSafe_Couldn_t_find___0___in___1__ { - get { - return ResourceManager.GetString("Program_MainSafe_Couldn_t_find___0___in___1__", resourceCulture); - } - } - + /// /// Cerca una stringa localizzata simile a Exiled folder: {0}. /// @@ -169,7 +151,7 @@ internal static string Program_MainSafe_Exiled_folder___0_ { return ResourceManager.GetString("Program_MainSafe_Exiled_folder___0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Installation complete. /// @@ -178,7 +160,7 @@ internal static string Program_MainSafe_Installation_complete { return ResourceManager.GetString("Program_MainSafe_Installation_complete", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Prereleases included - {0}. /// @@ -187,7 +169,7 @@ internal static string Program_MainSafe_Prereleases_included____0_ { return ResourceManager.GetString("Program_MainSafe_Prereleases_included____0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Read the exception message, read the readme, and if you still don't understand what to do, then contact #support in our discord server with the attached screenshot of the full exception. /// @@ -198,7 +180,7 @@ internal static string Program_MainSafe_Read_the_exception_message__read_the_rea "attached_screenshot_of_the_full_exception", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Receiving releases.... /// @@ -207,7 +189,7 @@ internal static string Program_MainSafe_Receiving_releases___ { return ResourceManager.GetString("Program_MainSafe_Receiving_releases___", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Release found!. /// @@ -216,7 +198,7 @@ internal static string Program_MainSafe_Release_found_ { return ResourceManager.GetString("Program_MainSafe_Release_found_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Searching for the latest release that matches the parameters.... /// @@ -225,7 +207,7 @@ internal static string Program_MainSafe_Searching_for_the_latest_release_that_ma return ResourceManager.GetString("Program_MainSafe_Searching_for_the_latest_release_that_matches_the_parameters___", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Target release version - {0}. /// @@ -234,7 +216,7 @@ internal static string Program_MainSafe_Target_release_version____0_ { return ResourceManager.GetString("Program_MainSafe_Target_release_version____0_", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Token detected! Using the token.... /// @@ -243,7 +225,7 @@ internal static string Program_MainSafe_Token_detected__Using_the_token___ { return ResourceManager.GetString("Program_MainSafe_Token_detected__Using_the_token___", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Couldn't resolve path for '{0}', update installer. /// @@ -252,7 +234,7 @@ internal static string Program_ProcessTarEntry_Couldn_t_resolve_path_for___0____ return ResourceManager.GetString("Program_ProcessTarEntry_Couldn_t_resolve_path_for___0____update_installer", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Extract for {0} is disabled. /// @@ -261,7 +243,7 @@ internal static string Program_ProcessTarEntry_Extract_for__0__is_disabled { return ResourceManager.GetString("Program_ProcessTarEntry_Extract_for__0__is_disabled", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Processing '{0}'. /// @@ -270,7 +252,7 @@ internal static string Program_ProcessTarEntry_Processing___0__ { return ResourceManager.GetString("Program_ProcessTarEntry_Processing___0__", resourceCulture); } } - + /// /// Cerca una stringa localizzata simile a Trying to find release... /// diff --git a/Exiled.Loader/AutoUpdateFiles.cs b/Exiled.Loader/AutoUpdateFiles.cs index 4dab2f7252..799fe6e420 100644 --- a/Exiled.Loader/AutoUpdateFiles.cs +++ b/Exiled.Loader/AutoUpdateFiles.cs @@ -17,6 +17,6 @@ public static class AutoUpdateFiles /// /// Gets which SCP: SL version generated Exiled. /// - public static readonly Version RequiredSCPSLVersion = new(12, 0, 2, 0); + public static readonly Version RequiredSCPSLVersion = new(13, 2, 0, 0); } } \ No newline at end of file diff --git a/Exiled.Loader/Config.cs b/Exiled.Loader/Config.cs index 06e9bd5fd6..aac7578b10 100644 --- a/Exiled.Loader/Config.cs +++ b/Exiled.Loader/Config.cs @@ -12,8 +12,8 @@ namespace Exiled.Loader using API.Enums; using API.Interfaces; - using Exiled.API.Features; + using YamlDotNet.Core; /// /// The configs of the loader. @@ -57,5 +57,17 @@ public sealed class Config : IConfig /// [Description("The config files distribution type (Default, Separated)")] public ConfigType ConfigType { get; set; } = ConfigType.Default; + + /// + /// Gets or sets the quotes wrapper type. + /// + [Description("Indicates in which quoted strings in configs will be wrapped (Any, SingleQuoted, DoubleQuoted, Folded, Literal)")] + public ScalarStyle ScalarStyle { get; set; } = ScalarStyle.SingleQuoted; + + /// + /// Gets or sets the quotes wrapper type. + /// + [Description("Indicates in which quoted strings with multiline in configs will be wrapped (Any, SingleQuoted, DoubleQuoted, Folded, Literal)")] + public ScalarStyle MultiLineScalarStyle { get; set; } = ScalarStyle.Literal; } } \ No newline at end of file diff --git a/Exiled.Loader/ConfigManager.cs b/Exiled.Loader/ConfigManager.cs index bb4f2056c2..f89ae29e90 100644 --- a/Exiled.Loader/ConfigManager.cs +++ b/Exiled.Loader/ConfigManager.cs @@ -18,6 +18,7 @@ namespace Exiled.Loader using Exiled.API.Features; using Exiled.API.Features.Pools; + using YamlDotNet.Core; /// @@ -100,7 +101,8 @@ public static IConfig LoadDefaultConfig(this IPlugin plugin, Dictionary try { - config = (IConfig)Loader.Deserializer.Deserialize(Loader.Serializer.Serialize(rawDeserializedConfig), plugin.Config.GetType()); + string rawConfigString = Loader.Serializer.Serialize(rawDeserializedConfig); + config = (IConfig)Loader.Deserializer.Deserialize(rawConfigString, plugin.Config.GetType()); plugin.Config.CopyProperties(config); } catch (YamlException yamlException) diff --git a/Exiled.Loader/Exiled.Loader.csproj b/Exiled.Loader/Exiled.Loader.csproj index 0182d5cfd0..af1efc98e5 100644 --- a/Exiled.Loader/Exiled.Loader.csproj +++ b/Exiled.Loader/Exiled.Loader.csproj @@ -18,7 +18,6 @@ - @@ -30,6 +29,7 @@ + @@ -51,10 +51,6 @@ - - - - if not "$(EXILED_DEV_PLUGINAPI_REFERENCE)"=="" copy /y "$(OutputPath)$(AssemblyName).dll" "$(EXILED_DEV_PLUGINAPI_REFERENCE)\" diff --git a/Exiled.Loader/Features/Configs/CommentsObjectDescriptor.cs b/Exiled.Loader/Features/Configs/CommentsObjectDescriptor.cs index 2ab8abfa3a..7284385405 100644 --- a/Exiled.Loader/Features/Configs/CommentsObjectDescriptor.cs +++ b/Exiled.Loader/Features/Configs/CommentsObjectDescriptor.cs @@ -35,16 +35,16 @@ public CommentsObjectDescriptor(IObjectDescriptor innerDescriptor, string commen /// public string Comment { get; private set; } - /// + /// public object Value => innerDescriptor.Value; - /// + /// public Type Type => innerDescriptor.Type; - /// + /// public Type StaticType => innerDescriptor.StaticType; - /// + /// public ScalarStyle ScalarStyle => innerDescriptor.ScalarStyle; } } \ No newline at end of file diff --git a/Exiled.Loader/Features/Configs/CommentsPropertyDescriptor.cs b/Exiled.Loader/Features/Configs/CommentsPropertyDescriptor.cs index 90544ea24c..52f4be6eb3 100644 --- a/Exiled.Loader/Features/Configs/CommentsPropertyDescriptor.cs +++ b/Exiled.Loader/Features/Configs/CommentsPropertyDescriptor.cs @@ -30,43 +30,43 @@ public CommentsPropertyDescriptor(IPropertyDescriptor baseDescriptor) Name = baseDescriptor.Name; } - /// + /// public string Name { get; set; } - /// + /// public Type Type => baseDescriptor.Type; - /// + /// public Type TypeOverride { get => baseDescriptor.TypeOverride; set => baseDescriptor.TypeOverride = value; } - /// + /// public int Order { get; set; } - /// + /// public ScalarStyle ScalarStyle { get => baseDescriptor.ScalarStyle; set => baseDescriptor.ScalarStyle = value; } - /// + /// public bool CanWrite => baseDescriptor.CanWrite; - /// + /// public void Write(object target, object value) { baseDescriptor.Write(target, value); } - /// + /// public T GetCustomAttribute() where T : Attribute => baseDescriptor.GetCustomAttribute(); - /// + /// public IObjectDescriptor Read(object target) { DescriptionAttribute description = baseDescriptor.GetCustomAttribute(); diff --git a/Exiled.Loader/Features/Configs/CustomConverters/AttachmentIdentifiersConverter.cs b/Exiled.Loader/Features/Configs/CustomConverters/AttachmentIdentifiersConverter.cs index 0685857a40..172a9de14d 100644 --- a/Exiled.Loader/Features/Configs/CustomConverters/AttachmentIdentifiersConverter.cs +++ b/Exiled.Loader/Features/Configs/CustomConverters/AttachmentIdentifiersConverter.cs @@ -24,19 +24,19 @@ namespace Exiled.Loader.Features.Configs.CustomConverters /// public sealed class AttachmentIdentifiersConverter : IYamlTypeConverter { - /// + /// public bool Accepts(Type type) => type == typeof(AttachmentName); - /// + /// public object ReadYaml(IParser parser, Type type) { if (!parser.TryConsume(out Scalar scalar) || !AttachmentIdentifier.TryParse(scalar.Value, out AttachmentName name)) - throw new InvalidDataException($"Invalid AttachmentNameTranslation value: {scalar.Value}."); + throw new InvalidDataException($"Invalid AttachmentNameTranslation value: {scalar?.Value}."); return Enum.Parse(type, name.ToString()); } - /// + /// public void WriteYaml(IEmitter emitter, object value, Type type) { AttachmentName name = default; diff --git a/Exiled.Loader/Features/Configs/CustomConverters/ColorConverter.cs b/Exiled.Loader/Features/Configs/CustomConverters/ColorConverter.cs index 13f80e6369..3c80a6b976 100644 --- a/Exiled.Loader/Features/Configs/CustomConverters/ColorConverter.cs +++ b/Exiled.Loader/Features/Configs/CustomConverters/ColorConverter.cs @@ -25,10 +25,10 @@ namespace Exiled.Loader.Features.Configs.CustomConverters /// public sealed class ColorConverter : IYamlTypeConverter { - /// + /// public bool Accepts(Type type) => type == typeof(Color); - /// + /// public object ReadYaml(IParser parser, Type type) { if (!parser.TryConsume(out _)) @@ -61,7 +61,7 @@ public object ReadYaml(IParser parser, Type type) return color; } - /// + /// public void WriteYaml(IEmitter emitter, object value, Type type) { Dictionary coordinates = DictionaryPool.Pool.Get(); diff --git a/Exiled.Loader/Features/Configs/CustomConverters/VectorsConverter.cs b/Exiled.Loader/Features/Configs/CustomConverters/VectorsConverter.cs index c42e6243d9..e0b2186879 100644 --- a/Exiled.Loader/Features/Configs/CustomConverters/VectorsConverter.cs +++ b/Exiled.Loader/Features/Configs/CustomConverters/VectorsConverter.cs @@ -25,10 +25,10 @@ namespace Exiled.Loader.Features.Configs.CustomConverters ///
public sealed class VectorsConverter : IYamlTypeConverter { - /// + /// public bool Accepts(Type type) => type == typeof(Vector2) || type == typeof(Vector3) || type == typeof(Vector4); - /// + /// public object ReadYaml(IParser parser, Type type) { if (!parser.TryConsume(out _)) @@ -61,7 +61,7 @@ public object ReadYaml(IParser parser, Type type) return vector; } - /// + /// public void WriteYaml(IEmitter emitter, object value, Type type) { Dictionary coordinates = DictionaryPool.Pool.Get(); diff --git a/Exiled.Loader/Features/Configs/TypeAssigningEventEmitter.cs b/Exiled.Loader/Features/Configs/TypeAssigningEventEmitter.cs new file mode 100644 index 0000000000..11e07be7b6 --- /dev/null +++ b/Exiled.Loader/Features/Configs/TypeAssigningEventEmitter.cs @@ -0,0 +1,43 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Loader.Features.Configs +{ + using System; + + using YamlDotNet.Core; + using YamlDotNet.Serialization; + using YamlDotNet.Serialization.EventEmitters; + + /// + /// Event emitter which wraps all strings in double quotes. + /// + public class TypeAssigningEventEmitter : ChainedEventEmitter + { + private readonly char[] multiline = new char[] { '\r', '\n', '\x85', '\x2028', '\x2029' }; + + /// + public TypeAssigningEventEmitter(IEventEmitter nextEmitter) + : base(nextEmitter) + { + } + + /// + public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter) + { + if (eventInfo.Source.StaticType != typeof(object) && Type.GetTypeCode(eventInfo.Source.StaticType) == TypeCode.String && !UnderscoredNamingConvention.Instance.Properties.Contains(eventInfo.Source.Value)) + { + if (eventInfo.Source.Value.ToString().IndexOfAny(multiline) is -1) + eventInfo.Style = LoaderPlugin.Config.ScalarStyle; + else + eventInfo.Style = LoaderPlugin.Config.MultiLineScalarStyle; + } + + base.Emit(eventInfo, emitter); + } + } +} diff --git a/Exiled.Loader/Features/Configs/UnderscoredNamingConvention.cs b/Exiled.Loader/Features/Configs/UnderscoredNamingConvention.cs new file mode 100644 index 0000000000..688909434b --- /dev/null +++ b/Exiled.Loader/Features/Configs/UnderscoredNamingConvention.cs @@ -0,0 +1,34 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Loader.Features.Configs +{ + using System.Collections.Generic; + + using Exiled.API.Extensions; + using YamlDotNet.Serialization; + + /// + public class UnderscoredNamingConvention : INamingConvention + { + /// + public static UnderscoredNamingConvention Instance { get; } = new(); + + /// + /// Gets the list. + /// + public List Properties { get; } = new(); + + /// + public string Apply(string value) + { + string newValue = value.ToSnakeCase(); + Properties.Add(newValue); + return newValue; + } + } +} \ No newline at end of file diff --git a/Exiled.Loader/Features/Configs/ValidatingNodeDeserializer.cs b/Exiled.Loader/Features/Configs/ValidatingNodeDeserializer.cs index ba8930a6b8..581671f126 100644 --- a/Exiled.Loader/Features/Configs/ValidatingNodeDeserializer.cs +++ b/Exiled.Loader/Features/Configs/ValidatingNodeDeserializer.cs @@ -10,6 +10,8 @@ namespace Exiled.Loader.Features.Configs using System; using System.ComponentModel.DataAnnotations; + using Exiled.API.Features; + using YamlDotNet.Core; using YamlDotNet.Serialization; @@ -29,17 +31,28 @@ public ValidatingNodeDeserializer(INodeDeserializer nodeDeserializer) this.nodeDeserializer = nodeDeserializer; } - /// + /// public bool Deserialize(IParser parser, Type expectedType, Func nestedObjectDeserializer, out object value) { - if (nodeDeserializer.Deserialize(parser, expectedType, nestedObjectDeserializer, out value)) + try { - Validator.ValidateObject(value, new ValidationContext(value, null, null), true); + if (nodeDeserializer.Deserialize(parser, expectedType, nestedObjectDeserializer, out value)) + { + if (value is null) + Log.Error("Null value"); + Validator.ValidateObject(value, new ValidationContext(value, null, null), true); - return true; - } + return true; + } - return false; + return false; + } + catch (Exception e) + { + Log.Error(e); + value = null; + return false; + } } } } \ No newline at end of file diff --git a/Exiled.Loader/Features/LoaderMessages.cs b/Exiled.Loader/Features/LoaderMessages.cs index 3e45151639..bd73f2131c 100644 --- a/Exiled.Loader/Features/LoaderMessages.cs +++ b/Exiled.Loader/Features/LoaderMessages.cs @@ -81,7 +81,7 @@ @@@@@@@@ @@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@@@ /// The correspondent loader message. public static string GetMessage() { - if (Loader.Random.NextDouble() <= 0.069) + if (Loader.Version.ToString().Contains("6.9") || Loader.Random.NextDouble() <= 0.069) return EasterEgg; return DateTime.Today.Month switch diff --git a/Exiled.Loader/Loader.cs b/Exiled.Loader/Loader.cs index 96616020cc..4303427461 100644 --- a/Exiled.Loader/Loader.cs +++ b/Exiled.Loader/Loader.cs @@ -29,7 +29,6 @@ namespace Exiled.Loader using Features.Configs.CustomConverters; using YamlDotNet.Serialization; - using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; /// @@ -96,10 +95,12 @@ public Loader() .WithTypeConverter(new VectorsConverter()) .WithTypeConverter(new ColorConverter()) .WithTypeConverter(new AttachmentIdentifiersConverter()) + .WithEventEmitter(eventEmitter => new TypeAssigningEventEmitter(eventEmitter)) .WithTypeInspector(inner => new CommentGatheringTypeInspector(inner)) .WithEmissionPhaseObjectGraphVisitor(args => new CommentsObjectGraphVisitor(args.InnerVisitor)) .WithNamingConvention(UnderscoredNamingConvention.Instance) .IgnoreFields() + .DisableAliases() .Build(); /// @@ -265,6 +266,9 @@ public static void EnablePlugins() plugin.OnRegisteringCommands(); toLoad.Remove(plugin); } + + if (plugin.Config.Debug) + Log.DebugEnabled.Add(plugin.Assembly); } catch (Exception exception) { @@ -314,6 +318,7 @@ public static void ReloadPlugins() Plugins.Clear(); Server.PluginAssemblies.Clear(); + Locations.Clear(); LoadPlugins(); diff --git a/Exiled.Loader/LoaderPlugin.cs b/Exiled.Loader/LoaderPlugin.cs index 9685cefb05..59d52a5c0c 100644 --- a/Exiled.Loader/LoaderPlugin.cs +++ b/Exiled.Loader/LoaderPlugin.cs @@ -41,8 +41,9 @@ public void Enable() return; } + Log.Info($"Loading EXILED Version: {Assembly.GetExecutingAssembly().GetCustomAttribute().InformationalVersion}"); if (!Config.ShouldLoadOutdatedExiled && - GameCore.Version.CompatibilityCheck( + !GameCore.Version.CompatibilityCheck( (byte)AutoUpdateFiles.RequiredSCPSLVersion.Major, (byte)AutoUpdateFiles.RequiredSCPSLVersion.Minor, (byte)AutoUpdateFiles.RequiredSCPSLVersion.Revision, @@ -52,12 +53,10 @@ public void Enable() GameCore.Version.BackwardCompatibility, GameCore.Version.BackwardRevision)) { - ServerConsole.AddLog("Exiled is outdated, please update to the latest version. Wait for release if still shows after update.", ConsoleColor.DarkRed); + ServerConsole.AddLog($"Exiled is outdated, please update to the latest version. Wait for release if still shows after update.\nSCP:SL: {GameCore.Version.VersionString} Exiled Supported Version: {AutoUpdateFiles.RequiredSCPSLVersion}", ConsoleColor.DarkRed); return; } - Log.Info($"Loading EXILED Version: {Assembly.GetExecutingAssembly().GetCustomAttribute().InformationalVersion}"); - Paths.Reload(Config.ExiledDirectoryPath); Log.Info($"Exiled root path set to: {Paths.Exiled}"); @@ -73,12 +72,6 @@ public void Enable() return; } - if (!File.Exists(Path.Combine(Paths.Dependencies, "YamlDotNet.dll"))) - { - Log.Error($"YamlDotNet.dll was not found at {Path.Combine(Paths.Dependencies, "YamlDotNet.dll")}, Exiled won't be loaded!"); - return; - } - new Loader().Run(); } } diff --git a/Exiled.Loader/TranslationManager.cs b/Exiled.Loader/TranslationManager.cs index 89d563ced5..a6fd522e22 100644 --- a/Exiled.Loader/TranslationManager.cs +++ b/Exiled.Loader/TranslationManager.cs @@ -18,6 +18,7 @@ namespace Exiled.Loader using Exiled.API.Features; using Exiled.API.Features.Pools; + using YamlDotNet.Core; /// diff --git a/Exiled.Permissions/Exiled.Permissions.csproj b/Exiled.Permissions/Exiled.Permissions.csproj index 6479fa22a1..3c130764f8 100644 --- a/Exiled.Permissions/Exiled.Permissions.csproj +++ b/Exiled.Permissions/Exiled.Permissions.csproj @@ -17,7 +17,6 @@ - @@ -29,6 +28,7 @@ + diff --git a/Exiled.Updater/Exiled.Updater.csproj b/Exiled.Updater/Exiled.Updater.csproj index afd22da2f7..facd0acda6 100644 --- a/Exiled.Updater/Exiled.Updater.csproj +++ b/Exiled.Updater/Exiled.Updater.csproj @@ -6,17 +6,17 @@ Exiled.Updater false - 3.1.1 $(NoWarn);CS1591;SA1600;SA1401;SA1309;SA1134;SA1123;SA1201 Debug;Release;Installer AnyCPU + 3.1.2 + 3.1.2 - diff --git a/Exiled.Updater/Updater.cs b/Exiled.Updater/Updater.cs index d02a5b1317..3efbfdd8f2 100644 --- a/Exiled.Updater/Updater.cs +++ b/Exiled.Updater/Updater.cs @@ -166,6 +166,10 @@ private bool FindUpdate(HttpClient client, bool forced, out NewVersion newVersio Log.Info("No new versions found, you're using the most recent version of Exiled!"); } } + catch (Utf8Json.JsonParsingException) + { + Log.Error("Encountered GitHub ratelimit, unable to check and download the latest version of Exiled."); + } catch (Exception ex) { Log.Error($"{nameof(FindUpdate)} threw an exception:\n{ex}"); @@ -300,6 +304,14 @@ private void Update(HttpClient client, NewVersion newVersion) }; Process installerProcess = Process.Start(startInfo); + + if (installerProcess is null) + { + Log.Error("Unable to start installer."); + _stage = Stage.Free; + return; + } + installerProcess.OutputDataReceived += (s, args) => { if (!string.IsNullOrEmpty(args.Data)) @@ -316,9 +328,16 @@ private void Update(HttpClient client, NewVersion newVersion) installerProcess.WaitForExit(); Log.Info($"Installer exit code: {installerProcess.ExitCode}"); - Log.Info("Auto-update complete, restarting server..."); - - _stage = Stage.Installed; + if (installerProcess.ExitCode == 0) + { + Log.Info("Auto-update complete, restarting server..."); + _stage = Stage.Installed; + } + else + { + Log.Error($"Installer error occured."); + _stage = Stage.Free; + } } } catch (Exception ex) diff --git a/Exiled.ruleset b/Exiled.ruleset index 04b87139ae..d5016ef480 100644 --- a/Exiled.ruleset +++ b/Exiled.ruleset @@ -1,10 +1,10 @@  - + - + - - + + \ No newline at end of file diff --git a/Exiled/Exiled.nuspec b/Exiled/Exiled.nuspec index 68c3374230..2e233bf5d8 100644 --- a/Exiled/Exiled.nuspec +++ b/Exiled/Exiled.nuspec @@ -27,6 +27,7 @@ + diff --git a/GettingStarted.md b/GettingStarted.md index 74791dd71e..a2f965fdcb 100644 --- a/GettingStarted.md +++ b/GettingStarted.md @@ -81,7 +81,7 @@ public override OnEnable() // Register the event handler class. And add the event, // to the EXILED_Events event listener so we get the event. EventHandler = new EventHandlers(); - Player.Joined += EventHandler.PlayerJoined; + Player.Verified += EventHandler.PlayerVerified; } public override OnDisable() @@ -89,7 +89,7 @@ public override OnDisable() // Make it dynamically updatable. // We do this by removing the listener for the event and then nulling the event handler. // This process must be repeated for each event. - Player.Joined -= EventHandler.PlayerJoined; + Player.Verified -= EventHandler.PlayerVerified; EventHandler = null; } ``` @@ -99,20 +99,20 @@ And in the EventHandlers class we would do: ```csharp public class EventHandlers { - public void PlayerJoined(JoinedEventArgs ev) + public void PlayerVerified(VerifiedEventArgs ev) { } } ``` -Now we have successfully hooked to a player join event which fires when ever a player joins! It is important to note that every event has different event arguments, and each type of event argument has different properties associated with it. +Now we have successfully hooked to a player verified event which fires when ever a player is authenticated after joining the server! It is important to note that every event has different event arguments, and each type of event argument has different properties associated with it. EXILED already provides a broadcast function, so let's use it in our event: ```csharp public class EventHandlers { - public void PlayerJoined(JoinedEventArgs ev) + public void PlayerVerified(VerifiedEventArgs ev) { ev.Player.Broadcast(5, "Welcome to my cool server!"); } @@ -149,9 +149,9 @@ public class EventHandlers { public void TriggeringTesla(TriggeringTeslaEventArgs ev) { - // Disable the event for nine tailed fox players. - // This can be accomplished by checking the player's team. - if (ev.Player.Team == Team.MTF) { + // Disable the event for foundation personnel players. + // This can be accomplished by checking the player's side. + if (ev.Player.Role.Side == Side.Mtf) { // Disable the tesla trigger by setting ev.IsTriggerable to false. // Players who have a MTF ranking will no longer trigger tesla gates. ev.IsTriggerable = false; diff --git "a/Localization/README-\320\240\321\203\321\201\321\201\320\272\320\270\320\271.md" "b/Localization/README-\320\240\321\203\321\201\321\201\320\272\320\270\320\271.md" index 46ee3cf76f..47072a9722 100644 --- "a/Localization/README-\320\240\321\203\321\201\321\201\320\272\320\270\320\271.md" +++ "b/Localization/README-\320\240\321\203\321\201\321\201\320\272\320\270\320\271.md" @@ -34,7 +34,7 @@ EXILED - низкоуровневый фреймворк для серверов ### Установка вручную - Скачайте **`Exiled.tar.gz` [отсюда](https://github.com/galaxy119/EXILED/releases)**. - Распакуйте его содержимое с помощью [7Zip](https://www.7-zip.org/) или [WinRar](https://www.win-rar.com/download.html?&L=6). -- Переместите папку **`EXILED`** в **`%appdata%`** *Примечание: Эта папка должна находиться в ``C:\Users\(Your_User)\AppData\Roaming``, и ***НЕ*** ``C:\Users\(Your_User)\AppData\Roaming\SCP Secret Laboratory``, и **ЭТО ДОЛЖНО** быть в (. ...)\AppData\Roaming, а не (...)\AppData\!*. +- Переместите папку **`EXILED`** в **`%appdata%`** *Примечание: Эта папка должна находиться в ``C:\Users\(ВАШ_ПОЛЬЗОВАТЕЛЬ)\AppData\Roaming``, и ***НЕ*** ``C:\Users\(ВАШ_ПОЛЬЗОВАТЕЛЬ)\AppData\Roaming\SCP Secret Laboratory``, и **ЭТО ДОЛЖНО** быть в (. ...)\AppData\Roaming, а не (...)\AppData\!*. - Переместите **``SCP Secret Laboratory``** в **`%appdata%`**. - Windows 10: Напишите `%appdata%` в Cortana / значке поиска или в строке проводника Windows. @@ -45,7 +45,7 @@ EXILED - низкоуровневый фреймворк для серверов Вот и все, теперь EXILED должен быть установлен и активен при следующей загрузке вашего сервера. Обратите внимание, что EXILED сам по себе почти ничего не делает, поэтому обязательно получайте новые плагины с **[нашего сервера Discord](https://discord.gg/PyUkWTg)**. - Чтобы установить плагин, просто: - Скачайте плагин с [*их* страницы релизов](https://i.imgur.com/u34wgPD.jpg) (**он ДОЛЖЕН быть `.dll`!**) - - Переместите его в: ``C:\Users\(Your_User)\AppData\Roaming\EXILED\Plugins`` (переместите его сюда, нажав Win + R, а затем написав `%appdata%`) + - Переместите его в: ``C:\Users\(ВАШ_ПОЛЬЗОВАТЕЛЬ)\AppData\Roaming\EXILED\Plugins`` (переместите его сюда, нажав Win + R, а затем написав `%appdata%`) # Linux ### Автоматическая установка ([подробнее](https://github.com/galaxy119/EXILED/blob/master/Exiled.Installer/README.md)) @@ -62,8 +62,8 @@ EXILED - низкоуровневый фреймворк для серверов - **Убедитесь**, что вы вошли в систему под пользователем, который запускает SCP-серверы. - Скачайте **`Exiled.tar.gz` [отсюда](https://github.com/galaxy119/EXILED/releases)** (SSH: щелкните правой кнопкой мыши и получите ссылку `Exiled.tar.gz`, затем введите: **`wget (link_to_download)`**) - Чтобы извлечь его в текущую папку, введите **``tar -xzvf EXILED.tar.gz``**. -- Переместите **`SCP Secret Laboratory`** папку в **``~/.config``**. *Примечание: Эта папка должна находиться в ``~/.config``, а ***НЕ*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv SCP Secret Laboratory ~/.config/`**) -- Переместите папку **`EXILED`** в **``~/.config``**. *Примечание: Эта папка должна находиться в ``~/.config``, и ***NOT*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv EXILED ~/.config/`**) +- Переместите **`SCP Secret Laboratory`** папку в **``~/.config``**. *Примечание: Эта папка должна находиться в ``~/.config``, а ***НЕ В*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv SCP Secret Laboratory ~/.config/`**) +- Переместите папку **`EXILED`** в **``~/.config``**. *Примечание: Эта папка должна находиться в ``~/.config``, и ***НЕ В*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv EXILED ~/.config/`**) ### Устaновка плагинов Linux Вот и все, теперь EXILED будет установлен и активен при следующей загрузке вашего сервера. Обратите внимание, что EXILED сам по себе почти ничего не делает, поэтому обязательно получайте новые плагины с **[нашего сервера Discord](https://discord.gg/PyUkWTg)**. @@ -111,10 +111,10 @@ public void SomeMethod() public IEnumerator MyCoroutine() { - for (;;) //бесконечно повторять следующие действия + for (;;) // Бесконечно повторять следующие действия { - Log.Info("Hey I'm a infinite loop!"); //Вызов Log.Info для печати строки в журналы игровой консоли/сервера. - yield return Timing.WaitForSeconds(5f); //Говорит coroutine подождать 5 секунд перед продолжением, поскольку это происходит в конце цикла, это эффективно останавливает цикл от повторения на 5 секунд. + Log.Info("Эй, Я бесконечный цикл!"); // Вызов Log.Info для печати строки в журналы игровой консоли/сервера. + yield return Timing.WaitForSeconds(5f); // Говорит coroutine подождать 5 секунд перед продолжением, поскольку это происходит в конце цикла, это эффективно останавливает цикл от повторения на 5 секунд. } } ``` @@ -123,7 +123,7 @@ public IEnumerator MyCoroutine() ### Динамические обновления EXILED как фреймворк поддерживает динамическую перезагрузку сборок плагинов, не требуя перезагрузки сервера. -Например, если вы запускаете сервер с единственным плагином `Exiled.Events` и хотите добавить новый, вам не нужно перезагружать сервер для выполнения этой задачи. Вы можете просто использовать команду RemoteAdmin/ServerConsole `reload plugins` для перезагрузки всех плагинов EXILED, включая новые, которые не были загружены ранее. +Например, если вы запускаете сервер с единственным плагином `Exiled.Events` и хотите добавить новый, вам не нужно перезагружать сервер для выполнения этой задачи. Вы можете просто использовать команду `reload plugins` в RemoteAdmin или в консоли сервера для перезагрузки всех плагинов EXILED, и загрузки новых, которые не были загружены ранее. Это также означает, что вы можете *обновлять* плагины без полной перезагрузки сервера. Однако есть несколько рекомендаций, которым должен следовать разработчик плагина, чтобы это было сделано правильно: diff --git a/docs/.gitignore b/docs/.gitignore index b2d6de3062..a71a551d45 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -18,3 +18,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +/package-lock.json diff --git a/docs/App.config b/docs/App.config new file mode 100644 index 0000000000..193aecc675 --- /dev/null +++ b/docs/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docs/docs.csproj b/docs/docs.csproj new file mode 100644 index 0000000000..44ed923d9c --- /dev/null +++ b/docs/docs.csproj @@ -0,0 +1,57 @@ + + + + + docs + true + Debug;Release;Installer + AnyCPU + + + + + + + <_Parameter1>Exiled.API + + + + + + + + + + + + True + True + Intro.tt + + + + + TextTemplatingFileGenerator + Intro.md + + + + + $(EXILED_REFERENCES)\Assembly-CSharp-Publicized.dll + + + + + + + + + + + + + + + + + diff --git a/docs/docs/Resources/Intro.md b/docs/docs/Resources/Intro.md index 49cf217f7b..53713e86e9 100644 --- a/docs/docs/Resources/Intro.md +++ b/docs/docs/Resources/Intro.md @@ -4,7 +4,7 @@ sidebar_position: 1 ### Index -- [RoleType, Team, Side, Faction](#roletype-team-side-and-faction) +- [RoleType, Team, Side, LeadingTeam](#roletype-team-side-and-leadingteam) - [ItemType](#itemtype) - [AmmoType](#ammotype) - [DoorType](#doortype) @@ -18,7 +18,6 @@ sidebar_position: 1 - [StructureType](#structuretype) - [BloodType](#bloodtype) - [GeneratorState](#generatorstate) -- [HotKeyButton](#hotkeybutton) - [IntercomStates](#intercomstates) - [BroadcastType](#broadcasttype) - [Attachment Names](#attachmentnames) @@ -31,35 +30,37 @@ sidebar_position: 1 ## Resources -### RoleType, Team, Side and Faction +### RoleType, Team, Side and LeadingTeam
Roles -```md title="Latest Updated: 08/23/2021" -| Id | RoleType | Team | Side | Faction | -|-----|----------------|------|-----------------|-----------------| -| -1 | None | RIP | None | Others | -| 0 | Scp173 | SCP | Scp | SCP | -| 1 | ClassD | CDP | ChaosInsurgency | FoundationEnemy | -| 2 | Spectator | RIP | None | Others | -| 3 | Scp106 | SCP | Scp | SCP | -| 4 | NtfSpecialist | MTF | Mtf | FoundationStaff | -| 5 | Scp049 | SCP | Scp | SCP | -| 6 | Scientist | RSC | Mtf | FoundationStaff | -| 7 | Scp079 | SCP | Scp | SCP | -| 8 | ChaosConscript | CHI | ChaosInsurgency | FoundationEnemy | -| 9 | Scp096 | SCP | Scp | SCP | -| 10 | Scp0492 | SCP | Scp | SCP | -| 11 | NtfSergeant | MTF | Mtf | FoundationStaff | -| 12 | NtfCaptain | MTF | Mtf | FoundationStaff | -| 13 | NtfPrivate | MTF | Mtf | FoundationStaff | -| 14 | Tutorial | TUT | Tutorial | Others | -| 15 | FacilityGuard | MTF | Mtf | FoundationStaff | -| 16 | Scp93953 | SCP | Scp | SCP | -| 17 | Scp93989 | SCP | Scp | SCP | -| 18 | ChaosRifleman | CHI | ChaosInsurgency | FoundationEnemy | -| 19 | ChaosRepressor | CHI | ChaosInsurgency | FoundationEnemy | -| 20 | ChaosMarauder | CHI | ChaosInsurgency | FoundationEnemy | +```md title="Latest Updated: 13.2.0.0" +| Id | RoleTypeId | Team | Side | LeadingTeam | +|-----|----------------|------------------|------------------|-----------------| +| -1 | None | Dead | None | Draw | +| 0 | Scp173 | SCPs | Scp | Anomalies | +| 1 | ClassD | ClassD | ChaosInsurgency | ChaosInsurgency | +| 2 | Spectator | Dead | None | Draw | +| 3 | Scp106 | SCPs | Scp | Anomalies | +| 4 | NtfSpecialist | FoundationForces | Mtf | FacilityForces | +| 5 | Scp049 | SCPs | Scp | Anomalies | +| 6 | Scientist | Scientists | Mtf | FacilityForces | +| 7 | Scp079 | SCPs | Scp | Anomalies | +| 8 | ChaosConscript | ChaosInsurgency | ChaosInsurgency | ChaosInsurgency | +| 9 | Scp096 | SCPs | Scp | Anomalies | +| 10 | Scp0492 | SCPs | Scp | Anomalies | +| 11 | NtfSergeant | FoundationForces | Mtf | FacilityForces | +| 12 | NtfCaptain | FoundationForces | Mtf | FacilityForces | +| 13 | NtfPrivate | FoundationForces | Mtf | FacilityForces | +| 14 | Tutorial | OtherAlive | Tutorial | Draw | +| 15 | FacilityGuard | FoundationForces | Mtf | FacilityForces | +| 16 | Scp939 | SCPs | Scp | Anomalies | +| 17 | CustomRole | Dead | None | Draw | +| 18 | ChaosRifleman | ChaosInsurgency | ChaosInsurgency | ChaosInsurgency | +| 19 | ChaosMarauder | ChaosInsurgency | ChaosInsurgency | ChaosInsurgency | +| 20 | ChaosRepressor | ChaosInsurgency | ChaosInsurgency | ChaosInsurgency | +| 21 | Overwatch | Dead | None | Draw | +| 22 | Filmmaker | Dead | None | Draw | ```
@@ -68,55 +69,62 @@ sidebar_position: 1
Items -```md title="Latest Updated: 05/08/2022" - () -None -1 -KeycardJanitor 0 -KeycardScientist 1 -KeycardResearchCoordinator 2 -KeycardZoneManager 3 -KeycardGuard 4 -KeycardNTFOfficer 5 -KeycardContainmentEngineer 6 -KeycardNTFLieutenant 7 -KeycardNTFCommander 8 -KeycardFacilityManager 9 -KeycardChaosInsurgency 10 -KeycardO5 11 -Radio 12 -GunCOM15 13 -Medkit 14 -Flashlight 15 -MicroHID 16 -SCP500 17 -SCP207 18 -Ammo12gauge 19 -GunE11SR 20 -GunCrossvec 21 -Ammo556x45 22 -GunFSP9 23 -GunLogicer 24 -GrenadeHE 25 -GrenadeFlash 26 -Ammo44cal 27 -Ammo762x39 28 -Ammo9x19 29 -GunCOM18 30 -SCP018 31 -SCP268 32 -Adrenaline 33 -Painkillers 34 -Coin 35 -ArmorLight 36 -ArmorCombat 37 -ArmorHeavy 38 -GunRevolver 39 -GunAK 40 -GunShotgun 41 -SCP330 42 -SCP2176 43 -SCP244a 44 -SCP244b 45 +```md title="Latest Updated: 13.2.0.0" +[-1] None +[0] KeycardJanitor +[1] KeycardScientist +[2] KeycardResearchCoordinator +[3] KeycardZoneManager +[4] KeycardGuard +[5] KeycardMTFPrivate +[6] KeycardContainmentEngineer +[7] KeycardMTFOperative +[8] KeycardMTFCaptain +[9] KeycardFacilityManager +[10] KeycardChaosInsurgency +[11] KeycardO5 +[12] Radio +[13] GunCOM15 +[14] Medkit +[15] Flashlight +[16] MicroHID +[17] SCP500 +[18] SCP207 +[19] Ammo12gauge +[20] GunE11SR +[21] GunCrossvec +[22] Ammo556x45 +[23] GunFSP9 +[24] GunLogicer +[25] GrenadeHE +[26] GrenadeFlash +[27] Ammo44cal +[28] Ammo762x39 +[29] Ammo9x19 +[30] GunCOM18 +[31] SCP018 +[32] SCP268 +[33] Adrenaline +[34] Painkillers +[35] Coin +[36] ArmorLight +[37] ArmorCombat +[38] ArmorHeavy +[39] GunRevolver +[40] GunAK +[41] GunShotgun +[42] SCP330 +[43] SCP2176 +[44] SCP244a +[45] SCP244b +[46] SCP1853 +[47] ParticleDisruptor +[48] GunCom45 +[49] SCP1576 +[50] Jailbird +[51] AntiSCP207 +[52] GunFRMG0 +[53] GunA7 ```
@@ -126,12 +134,13 @@ SCP244b 45
Ammo -```md title="Latest Updated: 05/08/2022" -Nato9 -Nato556 -Nato762 -Ammo12Gauge -Ammo44Cal +```md title="Latest Updated: 8.0.0.0" +[0] None +[1] Nato556 +[2] Nato762 +[3] Nato9 +[4] Ammo12Gauge +[5] Ammo44Cal ```
@@ -140,49 +149,65 @@ Ammo44Cal
Doors -```md title="Latest Updated: 05/08/2022" -UnknownDoor -Scp914Door -GR18Inner -Scp049Gate -Scp049Armory -Scp079First -Scp079Second -Scp096 -Scp106Bottom -Scp106Primary -Scp106Secondary -Scp173Gate -Scp173Connector -Scp173Armory -Scp173Bottom -GR18Gate -Scp914Gate -CheckpointEntrance -CheckpointLczA -CheckpointLczB -EntranceDoor -EscapePrimary -EscapeSecondary -ServersBottom -GateA -GateB -HczArmory -HeavyContainmentDoor -HID -HIDLeft -HIDRight -Intercom -LczArmory -LczCafe -LczWc -LightContainmentDoor -NukeArmory -NukeSurface -PrisonDoor -SurfaceGate -Scp330 -Scp330Chamber +```md title="Latest Updated: 8.0.0.0" +[0] UnknownDoor +[1] Scp914Door +[2] GR18Inner +[3] Scp049Gate +[4] Scp049Armory +[5] Scp079First +[6] Scp079Second +[7] Scp096 +[8] Scp079Armory +[9] Scp106Primary +[10] Scp106Secondary +[11] Scp173Gate +[12] Scp173Connector +[13] Scp173Armory +[14] Scp173Bottom +[15] GR18Gate +[16] Scp914Gate +[17] Scp939Cryo +[18] CheckpointLczA +[19] CheckpointLczB +[20] EntranceDoor +[21] EscapePrimary +[22] EscapeSecondary +[23] ServersBottom +[24] GateA +[25] GateB +[26] HczArmory +[27] HeavyContainmentDoor +[28] HID +[29] HIDLeft +[30] HIDRight +[31] Intercom +[32] LczArmory +[33] LczCafe +[34] LczWc +[35] LightContainmentDoor +[36] NukeArmory +[37] NukeSurface +[38] PrisonDoor +[39] SurfaceGate +[40] Scp330 +[41] Scp330Chamber +[42] CheckpointGate +[43] SurfaceDoor +[44] CheckpointEzHczA +[45] CheckpointEzHczB +[46] UnknownGate +[47] UnknownElevator +[48] ElevatorGateA +[49] ElevatorGateB +[50] ElevatorNuke +[51] ElevatorScp049 +[52] ElevatorLczA +[53] ElevatorLczB +[54] CheckpointArmoryA +[55] CheckpointArmoryB +[56] Airlock +[57] Scp173NewGate ```
@@ -193,56 +218,62 @@ Scp330Chamber
Rooms -```md title="Latest Updated: 05/08/2022" -Unknown -LczArmory -LczCurve -LczStraight -Lcz330 -Lcz914 -LczCrossing -LczTCross -LczCafe -LczPlants -LczToilets -LczAirlock -Lcz173 -LczClassDSpawn -LczChkpB -LczGlassBox -LczChkpA -Hcz079 -HczEzCheckpoint -HczArmory -Hcz939 -HczHid -Hcz049 -HczChkpA -HczCrossing -Hcz106 -HczNuke -HczTesla -HczServers -HczChkpB -HczTCross -HczCurve -Hcz096 -EzVent -EzIntercom -EzGateA -EzDownstairsPcs -EzCurve -EzPcs -EzCrossing -EzCollapsedTunnel -EzConference -EzStraight -EzCafeteria -EzUpstairsPcs -EzGateB -EzShelter -Pocket -Surface +```md title="Latest Updated: 8.0.0.0" +[0] Unknown +[1] LczArmory +[2] LczCurve +[3] LczStraight +[4] Lcz012 +[5] Lcz914 +[6] LczCrossing +[7] LczTCross +[8] LczCafe +[9] LczPlants +[10] LczToilets +[11] LczAirlock +[12] Lcz173 +[13] LczClassDSpawn +[14] LczCheckpointB +[15] LczGlassBox +[16] LczCheckpointA +[17] Hcz079 +[18] HczEzCheckpointA +[19] HczEzCheckpointB +[20] HczArmory +[21] Hcz939 +[22] HczHid +[23] Hcz049 +[24] HczCrossing +[25] Hcz106 +[26] HczNuke +[27] HczTesla +[28] HczServers +[29] HczTCross +[30] HczCurve +[31] Hcz096 +[32] EzVent +[33] EzIntercom +[34] EzGateA +[35] EzDownstairsPcs +[36] EzCurve +[37] EzPcs +[38] EzCrossing +[39] EzCollapsedTunnel +[40] EzConference +[41] EzStraight +[42] EzCafeteria +[43] EzUpstairsPcs +[44] EzGateB +[45] EzShelter +[46] Pocket +[47] Surface +[48] HczStraight +[49] EzTCross +[50] Lcz330 +[51] EzCheckpointHallway +[52] HczTestRoom +[53] HczElevatorA +[54] HczElevatorB ```
@@ -251,14 +282,14 @@ Surface
Elevators -```md title="Latest Updated: 05/08/2022" -Unknown -GateA -GateB -Nuke -Scp049 -LczA -LczB +```md title="Latest Updated: 8.0.0.0" +[0] Unknown +[1] GateA +[2] GateB +[3] Nuke +[4] Scp049 +[5] LczA +[6] LczB ```
@@ -267,43 +298,48 @@ LczB
DamageType -```md title="Latest Updated: 05/08/2022" -Unknown -Falldown -Warhead -Decontamination -Asphyxiation -Poison -Bleeding -MicroHid -Tesla -Scp -Explosion -Scp018 -Scp207 -Recontainment -Crushed -FemurBreaker -PocketDimension -FriendlyFireDetector -SeveredHands -Custom -Scp049 -Scp0492 -Scp096 -Scp173 -Scp106 -Scp939 -Crossvec -Logicer -Revolver -Shotgun -AK -Com15 -Com18 -Fsp9 -E11Sr -Hypothermia +```md title="Latest Updated: 8.0.0.0" +[0] Unknown +[1] Falldown +[2] Warhead +[3] Decontamination +[4] Asphyxiation +[5] Poison +[6] Bleeding +[7] Firearm +[8] MicroHid +[9] Tesla +[10] Scp +[11] Explosion +[12] Scp018 +[13] Scp207 +[14] Recontainment +[15] Crushed +[16] FemurBreaker +[17] PocketDimension +[18] FriendlyFireDetector +[19] SeveredHands +[20] Custom +[21] Scp049 +[22] Scp096 +[23] Scp173 +[24] Scp939 +[25] Scp0492 +[26] Scp106 +[27] Crossvec +[28] Logicer +[29] Revolver +[30] Shotgun +[31] AK +[32] Com15 +[33] Com18 +[34] Fsp9 +[35] E11Sr +[36] Hypothermia +[37] ParticleDisruptor +[38] CardiacArrest +[39] Com45 +[40] Jailbird ```
@@ -339,37 +375,44 @@ PlayerStatsSystem::Scp018DamageHandler : AttackerDamageHandler
Effects -```md title="Latest Updated: 05/08/2022" -Amnesia -Asphyxiated -Bleeding -Blinded -Burned -Concussed -Corroding -Deafened -Decontaminating -Disabled -Ensnared -Exhausted -Flashed -Hemorrhage -Invigorated -BodyshotReduction -Poisoned -Scp207 -Invisible -SinkHole -Visuals939 -DamageReduction -MovementBoost -RainbowTaste -SeveredHands -Stained -Visual173Blink -Vitality -Hypothermia -Scp1853 +```md title="Latest Updated: 8.0.0.0" +[0] AmnesiaItems +[1] AmnesiaVision +[2] Asphyxiated +[3] Bleeding +[4] Blinded +[5] Burned +[6] Concussed +[7] Corroding +[8] Deafened +[9] Decontaminating +[10] Disabled +[11] Ensnared +[12] Exhausted +[13] Flashed +[14] Hemorrhage +[15] Invigorated +[16] BodyshotReduction +[17] Poisoned +[18] Scp207 +[19] Invisible +[20] SinkHole +[21] DamageReduction +[22] MovementBoost +[23] RainbowTaste +[24] SeveredHands +[25] Stained +[26] Vitality +[27] Hypothermia +[28] Scp1853 +[29] CardiacArrest +[30] InsufficientLighting +[31] SoundtrackMute +[32] SpawnProtected +[33] Traumatized +[34] AntiScp207 +[35] Scanned +[36] PocketCorroding ```
@@ -378,19 +421,19 @@ Scp1853
Keycard Perms -```md title="Latest Updated: 05/08/2022" -<0> None -<1> Checkpoints -<2> ExitGates -<4> Intercom -<8> AlphaWarhead -<16> ContainmentLevelOne -<32> ContainmentLevelTwo -<64> ContainmentLevelThree -<128> ArmoryLevelOne -<256> ArmoryLevelTwo -<512> ArmoryLevelThree -<1024> ScpOverride +```md title="Latest Updated: 8.0.0.0" +[0] None +[1] Checkpoints +[2] ExitGates +[4] Intercom +[8] AlphaWarhead +[16] ContainmentLevelOne +[32] ContainmentLevelTwo +[64] ContainmentLevelThree +[128] ArmoryLevelOne +[256] ArmoryLevelTwo +[512] ArmoryLevelThree +[1024] ScpOverride ```
@@ -399,17 +442,18 @@ Scp1853
Lock Type -```md title="Latest Updated: 05/08/2022" -[0] None +```md title="Latest Updated: 8.0.0.0" +[0] None [1] Regular079 [2] Lockdown079 [4] Warhead -[8] AdminCommand -[16] DecontLockdown -[32] DecontEvacuate -[64] SpecialDoorFeature -[128] NoPower -[256] Isolation +[8] AdminCommand +[16] DecontLockdown +[32] DecontEvacuate +[64] SpecialDoorFeature +[128] NoPower +[256] Isolation +[512] Lockdown2176 ```
@@ -418,21 +462,13 @@ Scp1853
Structures -```md title="Latest Updated: 05/08/2022" -WorkStation -LargeGunLocker -RifleRack -MiscLocker -Generator -RegularMedkit -AdrenalineMedkit -Scp018Pedestal -Scp207Pedestal -Scp244Pedestal -Scp268Pedestal -Scp500Pedestal -Scp1853Pedestal -Scp2176Pedestal +```md title="Latest Updated: 13.2.0.0" +[0] StandardLocker +[1] LargeGunLocker +[2] ScpPedestal +[3] Scp079Generator +[4] SmallWallCabinet +[5] Workstation ```
@@ -441,11 +477,11 @@ Scp2176Pedestal
Blood -```md title="Latest Updated: 02/13/2022" -Default -Scp106 -Spreaded -Faded +```md title="Latest Updated: 8.0.0.0" +[0] Default +[1] Scp106 +[2] Spreaded +[3] Faded ```
@@ -454,26 +490,12 @@ Faded
GeneratorState -```md title="Latest Updated: 02/13/2022" -[1] None -[2] Unlocked -[4] Open -[8] Activating -[16] Engaged -``` - -
- -### HotKeyButton - -
Hot Keys - -```md title="Latest Updated: 02/13/2022" -Keycard -PrimaryFirearm -SecondaryFirearm -Medical -Grenade +```md title="Latest Updated: 8.0.0.0" +[1] None +[2] Unlocked +[4] Open +[8] Activating +[16] Engaged ```
@@ -482,26 +504,24 @@ Grenade
Intercom States -```md title="Latest Updated: 02/13/2022" -Ready -Transmitting -TransmittingBypass -Restarting -AdminSpeaking -Muted -Custom +```md title="Latest Updated: 13.2.0.0" +[0] Ready +[1] Starting +[2] InUse +[3] Cooldown +[4] NotFound ```
-### BroadcastType +### BroadcastFlags -
BroadcastType +
BroadcastFlags -```md title="Latest Updated: 02/13/2022" -Normal -Monospaced -AdminChat +```md title="Latest Updated: 13.2.0.0" +[0] Normal +[1] Truncated +[2] AdminChat ```
@@ -512,53 +532,53 @@ AdminChat
Attachment Names -```md title="Latest Updated: 04/27/2022" -None -IronSights -DotSight -HoloSight -NightVisionSight -AmmoSight -ScopeSight -StandardStock -ExtendedStock -RetractedStock -LightweightStock -HeavyStock -RecoilReducingStock -Foregrip -Laser -Flashlight -AmmoCounter -StandardBarrel -ExtendedBarrel -SoundSuppressor -FlashHider -MuzzleBrake -MuzzleBooster -StandardMagFMJ -StandardMagAP -StandardMagJHP -ExtendedMagFMJ -ExtendedMagAP -ExtendedMagJHP -DrumMagFMJ -DrumMagAP -DrumMagJHP -LowcapMagFMJ -LowcapMagAP -LowcapMagJHP -CylinderMag4 -CylinderMag6 -CylinderMag8 -CarbineBody -RifleBody -ShortBarrel -ShotgunChoke -ShotgunExtendedBarrel -NoRifleStock -ShotgunSingleShot -ShotgunDoubleShot +```md title="Latest Updated: 8.0.0.0" +[0] None +[1] IronSights +[2] DotSight +[3] HoloSight +[4] NightVisionSight +[5] AmmoSight +[6] ScopeSight +[7] StandardStock +[8] ExtendedStock +[9] RetractedStock +[10] LightweightStock +[11] HeavyStock +[12] RecoilReducingStock +[13] Foregrip +[14] Laser +[15] Flashlight +[16] AmmoCounter +[17] StandardBarrel +[18] ExtendedBarrel +[19] SoundSuppressor +[20] FlashHider +[21] MuzzleBrake +[22] MuzzleBooster +[23] StandardMagFMJ +[24] StandardMagAP +[25] StandardMagJHP +[26] ExtendedMagFMJ +[27] ExtendedMagAP +[28] ExtendedMagJHP +[29] DrumMagFMJ +[30] DrumMagAP +[31] DrumMagJHP +[32] LowcapMagFMJ +[33] LowcapMagAP +[34] LowcapMagJHP +[35] CylinderMag4 +[36] CylinderMag6 +[37] CylinderMag8 +[38] CarbineBody +[39] RifleBody +[40] ShortBarrel +[41] ShotgunChoke +[42] ShotgunExtendedBarrel +[43] NoRifleStock +[44] ShotgunSingleShot +[45] ShotgunDoubleShot ```
@@ -567,17 +587,16 @@ ShotgunDoubleShot
Spawn Reasons -```md title="Latest Updated: 02/13/2022" -None -RoundStart -LateJoin -Respawn -Died -Escaped -Revived -ForceClass -Overwatch - +```md title="Latest Updated: 8.0.0.0" +[0] None +[1] RoundStart +[2] LateJoin +[3] Respawn +[4] Died +[5] Escaped +[6] Revived +[7] ForceClass +[8] Destroyed ```
diff --git a/docs/docs/Resources/Intro.tt b/docs/docs/Resources/Intro.tt new file mode 100644 index 0000000000..9ba5ed4777 --- /dev/null +++ b/docs/docs/Resources/Intro.tt @@ -0,0 +1,339 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System" #> +<#@ assembly name="%EXILED_REFERENCES%\System.Core.dll" #> +<#@ assembly name="%EXILED_REFERENCES%\Mirror.dll" #> +<#@ assembly name="%EXILED_REFERENCES%\UnityEngine.CoreModule.dll" #> +<#@ assembly name="%EXILED_REFERENCES%\Assembly-CSharp-Publicized.dll" #> +<#@ assembly name="bin\Release\Exiled.API.dll" #> +<#@ assembly name="bin\Release\Exiled.Loader.dll" #> +<#@ import namespace="Exiled.API.Enums" #> +<#@ import namespace="Exiled.API.Extensions" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="PlayerRoles" #> +<#@ output extension=".md" #> +--- +sidebar_position: 1 +--- + +### Index + +- [RoleType, Team, Side, LeadingTeam](#roletype-team-side-and-leadingteam) +- [ItemType](#itemtype) +- [AmmoType](#ammotype) +- [DoorType](#doortype) +- [RoomType](#roomtype) +- [ElevatorType](#elevatortype) +- [DamageType](#damagetype) +- [Damage Handlers](#damagehandlers) +- [EffectType](#effecttype) +- [Keycard Permissions](#keycardpermissions) +- [DoorLockType](#doorlocktype) +- [StructureType](#structuretype) +- [BloodType](#bloodtype) +- [GeneratorState](#generatorstate) +- [IntercomStates](#intercomstates) +- [BroadcastType](#broadcasttype) +- [Attachment Names](#attachmentnames) +- [Spawn Reasons](#spawnreasons) +- [Prefabs](#prefabs) + +### External resources + +- [Available Colors (en.scpslgame.com)](https://en.scpslgame.com/index.php/Docs:Permissions#Colors) + +## Resources + +### RoleType, Team, Side and LeadingTeam + +
Roles + +```md title="Latest Updated: <#= Exiled.Loader.AutoUpdateFiles.RequiredSCPSLVersion#>" +| Id | RoleTypeId | Team | Side | LeadingTeam | +|-----|----------------|------------------|------------------|-----------------| +<#= string.Join("\n",Enum.GetValues(typeof(RoleTypeId)).Cast().ToList().OrderBy(x => x).Select(x => $"| {((int)x).ToString().PadRight(3)} | {x.ToString().PadRight(14)} | {RoleExtensions.GetTeam(x).ToString().PadRight(16)} | {RoleExtensions.GetSide(RoleExtensions.GetTeam(x)).ToString().PadRight(16)} | {RoleExtensions.GetLeadingTeam(RoleExtensions.GetTeam(x)).ToString().PadRight(16)}|"))#> +``` + +
+ +### ItemType + +
Items + +```md title="Latest Updated: <#= Exiled.Loader.AutoUpdateFiles.RequiredSCPSLVersion#>" +<#= string.Join("\n",Enum.GetValues(typeof(ItemType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ + +### AmmoType + +
Ammo + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(AmmoType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### DoorType + +
Doors + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(DoorType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ + + +### RoomType + +
Rooms + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(RoomType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### ElevatorType + +
Elevators + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(ElevatorType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### DamageType + +
DamageType + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(DamageType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### DamageHandlers + +
Damage Handlers + +```md title="Latest Updated: 05/08/2022" +All available DamageHandlers + ++ Symbol ':' literally means "inherits from" +* In C#, inheritance is a process in which one object acquires all the properties and behaviors of its parent object automatically. + +PlayerStatsSystem::DamageHandlerBase +PlayerStatsSystem::StandardDamageHandler : DamageHandlerBase +PlayerStatsSystem::AttackerDamageHandler : StandardDamageHandler +PlayerStatsSystem::CustomReasonDamageHandler : StandardDamageHandler +PlayerStatsSystem::UniversalDamageHandler : StandardDamageHandler +PlayerStatsSystem::WarheadDamageHandler : StandardDamageHandler +PlayerStatsSystem::RecontainmentDamageHandler : AttackerDamageHandler +PlayerStatsSystem::FirearmDamageHandler : AttackerDamageHandler +PlayerStatsSystem::ScpDamageHandler : AttackerDamageHandler +PlayerStatsSystem::Scp096DamageHandler : AttackerDamageHandler +PlayerStatsSystem::MicroHidDamageHandler : AttackerDamageHandler +PlayerStatsSystem::ExplosionDamageHandler : AttackerDamageHandler +PlayerStatsSystem::Scp018DamageHandler : AttackerDamageHandler +``` + +
+ +### EffectType + +
Effects + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(EffectType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### KeycardPermissions + +
Keycard Perms + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(KeycardPermissions)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### DoorLockType + +
Lock Type + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(DoorLockType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### StructureType + +
Structures + +```md title="Latest Updated: <#= Exiled.Loader.AutoUpdateFiles.RequiredSCPSLVersion#>" +<#= string.Join("\n",Enum.GetValues(typeof(MapGeneration.Distributors.StructureType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### BloodType + +
Blood + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(BloodType)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### GeneratorState + +
GeneratorState + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(GeneratorState)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### IntercomStates + +
Intercom States + +```md title="Latest Updated: <#= Exiled.Loader.AutoUpdateFiles.RequiredSCPSLVersion#>" +<#= string.Join("\n",Enum.GetValues(typeof(PlayerRoles.Voice.IntercomState)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### BroadcastFlags + +
BroadcastFlags + +```md title="Latest Updated: <#= Exiled.Loader.AutoUpdateFiles.RequiredSCPSLVersion#>" +<#= string.Join("\n",Enum.GetValues(typeof(Broadcast.BroadcastFlags)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ + + +### AttachmentNames + +
Attachment Names + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(InventorySystem.Items.Firearms.Attachments.AttachmentName)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### SpawnReasons + +
Spawn Reasons + +```md title="Latest Updated: <#= System.Reflection.Assembly.GetAssembly(typeof(Exiled.Loader.Loader)).GetName().Version#>" +<#= string.Join("\n",Enum.GetValues(typeof(SpawnReason)).Cast().ToList().OrderBy(x => x).Select(x => $"[{(int)x}] {x} "))#> +``` + +
+ +### Prefabs + +
Available Prefabs + +```md title="Latest Updated: 02/13/2022" +Guid | Name + +43658aa2-f339-6044-eb2b-937db0c2c4bd | Player +5bfd1bbe-10a4-e184-4a2e-381314b3380c | PlaybackLobby +9a77040d-663e-8a14-a8a2-297249bce483 | Pickup +307eb9b0-d080-9dc4-78e6-673847876412 | Work Station +0b58d568-fcd7-5384-abce-593a7931d65d | SCP-173_Ragdoll +f602bb4b-88de-d554-5976-5c2e18af4479 | Ragdoll_1 +ea314e24-bddd-5264-5b08-dadd1bcfa75e | SCP-106_Ragdoll +2b0290fb-6764-8f44-48ab-9294fe063c8f | Ragdoll_4 +05488a04-eda9-a724-18c9-bf2edbe23031 | Ragdoll_6 +e12d94d4-66ef-c734-2af0-aef522db57cb | Ragdoll_7 +9d7cf7ef-eec0-ece4-196c-4fd2c3cfd03a | Ragdoll_8 +e53f7b09-ad63-f924-6a96-0be4381af7f0 | SCP-096_Ragdoll +be41bb5a-3b5f-bc84-4ad4-d4e24dfa168f | Ragdoll_10 +c87cf6f7-fc36-f144-6ae5-727c8c8f4b9b | Ragdoll_14 +b8d25875-6346-0314-68a9-7d1b7ec71167 | SCP-939-53_Ragdoll +d2e872e1-1133-0984-186d-d3cdc686883f | SCP-939-89_Ragdoll +c69da0e5-a829-6a04-c8d9-f404a1073cfe | Grenade Flash +8063e113-c1f1-1514-7bc5-840ea8ee5f01 | Grenade Frag +38f8296e-fcf4-44f4-491b-b5dc69b8125b | Grenade SCP-018 +33f5e0b4-fb1c-0134-493f-5d7aec09dc38 | EZ BreakableDoor +5fbbe939-51c2-ef74-a9ed-bc0abfefa132 | HCZ BreakableDoor +b82d6236-b9f5-33d4-e8ee-8ee33fba6edd | LCZ BreakableDoor +3353122b-0ba2-5d14-fa64-886c45425967 | sportTargetPrefab +422b08ed-0bc0-6cb4-7a7f-81dd37c430c0 | dboyTargetPrefab +4f03f7fa-f417-ae84-382b-962c31614d1a | binaryTargetPrefab +a0e7ee93-b802-e5a4-38bd-95e27cc133ea | TantrumObj +43c40e13-5a2a-b3a4-9ba8-29c7002cedaf | Tutorial_Ragdoll +bf9a7ae6-aaea-0174-d807-e0d4adb1c524 | PrimitiveObjectToy +6996edbf-2adf-a5b4-e8ce-e089cf9710ae | LightSourceToy +19b3629a-3298-8324-0ad0-e841def23244 | RegularKeycardPickup +ef69975c-5a03-b9c4-fa26-0b6145b05824 | ChaosKeycardPickup +8359dd57-d964-98c4-5871-586da0d50878 | RadioPickup +52f9fa65-832f-b0f4-ab15-0ac33a45b853 | Com15Pickup +06361fcf-1355-ea54-7a0b-d7a29244eae9 | MedkitPickup +9902569b-0bc8-cf74-b814-a69789ed8c5a | FlashlightPickup +35f6c267-d9b6-f5a4-4a87-5523b7424052 | MicroHidPickup +30d95cc3-8b1f-bd14-4b66-f7350cf3bae9 | SCP500Pickup +46572711-4d8b-f8a4-2a81-b1ca2ff15b5d | SCP207Pickup +e7588f50-a788-bd44-89bf-f9dae4ab2071 | Ammo12gaPickup +9958e2c0-668f-9f14-c9ed-1cd97281f3d3 | E11SRPickup +7a39d145-d2d1-5724-7ad5-660cbe2f5757 | CrossvecPickup +0282bdfe-9880-d284-1807-2d4e11fc540d | Ammo556mmPickup +d32145e1-e7d9-d674-fbaa-078247910c49 | Fsp9Pickup +4ce1ab59-83ff-aa14-db7a-65e79c48cf8e | LogicerPickup +3f98e495-a544-11b4-dbc3-a03797786f52 | HegPickup +6e4bfac7-e1c9-9af4-9a76-c025cc8bbb37 | FlashbangPickup +8627c2a9-e397-2164-08dd-97f9fddab207 | Ammo44calPickup +ecba736b-7b69-0f14-ea94-7c9067dc7ea8 | Ammo762mmPickup +89a36c3a-be6b-5914-7b75-1287c79f19dc | Ammo9mmPickup +2a12ef7e-b39d-ed34-6979-571e541231b1 | Com18Pickup +a1d0c7dd-6523-8a34-3b4a-5124f47b93dd | Scp018Projectile +6fbfc036-04fb-1f94-7af0-1335064c0198 | SCP268Pickup +9695f1b9-46d6-7054-c9af-a35a4fefafe1 | AdrenalinePrefab +9925eed6-900f-7444-880f-393468fa1a63 | PainkillersPickup +522f199f-ce6f-5814-9a67-f0191d0110a9 | CoinPickup +51703b4d-a309-11c4-8af7-bdb8d95214c0 | Light Armor Pickup +02e10b6d-9d4d-ed14-2b8b-f5219522da77 | Combat Armor Pickup +19d03dd5-b491-acc4-ea16-be8ad5a33783 | Heavy Armor Pickup +635a3623-281c-e5c4-297d-7f07cd6a0eef | RevolverPickup +1821b416-953c-98f4-c9b8-09d2c192b8b1 | AkPickup +d6abff39-0c5c-1804-58de-ac4478538837 | ShotgunPickup +65141804-5071-27e4-c8c0-23c547ce629c | Scp330Pickup +830e7527-1f40-d0d4-3a3e-ff49f5a6176c | Scp2176Projectile +2401ec76-dce3-cf34-b858-7a9c7dc83b0b | SCP244APickup Variant +39825db8-2df8-eed4-caa5-a4c334c669a0 | SCP244BPickup Variant +68f13209-e652-6024-2b89-0f75fb88a998 | Scp268PedestalStructure Variant +17054030-9461-d104-5b92-9456c9eb0ab7 | Scp207PedestalStructure Variant +f4149b66-c503-87a4-0b93-aabfe7c352da | Scp500PedestalStructure Variant +a149d3eb-11bd-de24-f9dd-57187f5771ef | Scp018PedestalStructure Variant +5ad5dc6d-7bc5-3154-8b1a-3598b96e0d5b | LargeGunLockerStructure +850f84ad-e273-1824-8885-11ae5e01e2f4 | RifleRackStructure +d54bead1-286f-3004-facd-74482a872ad8 | MiscLocker +daf3ccde-4392-c0e4-882d-b7002185c6b8 | GeneratorStructure +ad8a455f-062d-dea4-5b47-ac9217d4c58b | Spawnable Work Station Structure +5b227bd2-1ed2-8fc4-2aa1-4856d7cb7472 | RegularMedkitStructure +db602577-8d4f-97b4-890b-8c893bfcd553 | AdrenalineMedkitStructure +fff1c10c-a719-bea4-d95c-3e262ed03ab2 | Scp2176PedestalStructure Variant +53cd67d2-995b-3374-4892-4190ffd48ee9 | HegProjectile +2a6e5abb-7999-b8d4-a926-310e3e9e2a13 | FlashbangProjectile +``` + +
+ diff --git a/docs/yarn.lock b/docs/yarn.lock index a610c031a8..30a750ad9b 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4,45 +4,50 @@ "@algolia/autocomplete-core@1.5.2": version "1.5.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz#ec0178e07b44fd74a057728ac157291b26cecf37" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz" integrity sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A== dependencies: "@algolia/autocomplete-shared" "1.5.2" "@algolia/autocomplete-preset-algolia@1.5.2": version "1.5.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz#36c5638cc6dba6ea46a86e5a0314637ca40a77ca" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz" integrity sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw== dependencies: "@algolia/autocomplete-shared" "1.5.2" "@algolia/autocomplete-shared@1.5.2": version "1.5.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz#e157f9ad624ab8fd940ff28bd2094cdf199cdd79" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz" integrity sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug== "@algolia/cache-browser-local-storage@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz#f8aa4fe31104b19d616ea392f9ed5c2ea847d964" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz" integrity sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg== dependencies: "@algolia/cache-common" "4.13.0" "@algolia/cache-common@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.0.tgz#27b83fd3939d08d72261b36a07eeafc4cb4d2113" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz" integrity sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA== +"@algolia/cache-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz" + integrity sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA== + "@algolia/cache-in-memory@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz#10801a74550cbabb64b59ff08c56bce9c278ff2d" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz" integrity sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg== dependencies: "@algolia/cache-common" "4.13.0" "@algolia/client-account@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.0.tgz#f8646dd40d1e9e3353e10abbd5d6c293ea92a8e2" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz" integrity sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA== dependencies: "@algolia/client-common" "4.13.0" @@ -51,7 +56,7 @@ "@algolia/client-analytics@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.0.tgz#a00bd02df45d71becb9dd4c5c993d805f2e1786d" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz" integrity sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA== dependencies: "@algolia/client-common" "4.13.0" @@ -61,24 +66,41 @@ "@algolia/client-common@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.0.tgz#8bc373d164dbdcce38b4586912bbe162492bcb86" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz" integrity sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA== dependencies: "@algolia/requester-common" "4.13.0" "@algolia/transporter" "4.13.0" +"@algolia/client-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz" + integrity sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ== + dependencies: + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + "@algolia/client-personalization@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.0.tgz#10fb7af356422551f11a67222b39c52306f1512c" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz" integrity sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA== dependencies: "@algolia/client-common" "4.13.0" "@algolia/requester-common" "4.13.0" "@algolia/transporter" "4.13.0" +"@algolia/client-search@^4.9.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz" + integrity sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w== + dependencies: + "@algolia/client-common" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + "@algolia/client-search@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.0.tgz#2d8ff8e755c4a37ec89968f3f9b358eed005c7f0" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz" integrity sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA== dependencies: "@algolia/client-common" "4.13.0" @@ -87,119 +109,90 @@ "@algolia/events@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== "@algolia/logger-common@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.0.tgz#be2606e71aae618a1ff1ea9a1b5f5a74284b35a8" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz" integrity sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA== +"@algolia/logger-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz" + integrity sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg== + "@algolia/logger-console@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.0.tgz#f28028a760e3d9191e28a10b12925e48f6c9afde" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz" integrity sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ== dependencies: "@algolia/logger-common" "4.13.0" "@algolia/requester-browser-xhr@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz#e2483f4e8d7f09e27cd0daf6c77711d15c5a919f" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz" integrity sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg== dependencies: "@algolia/requester-common" "4.13.0" "@algolia/requester-common@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.0.tgz#47fb3464cfb26b55ba43676d13f295d812830596" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz" integrity sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw== +"@algolia/requester-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz" + integrity sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ== + "@algolia/requester-node-http@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz#7d981bbd31492f51dd11820a665f9d8906793c37" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz" integrity sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ== dependencies: "@algolia/requester-common" "4.13.0" "@algolia/transporter@4.13.0": version "4.13.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.0.tgz#f6379e5329efa2127da68c914d1141f5f21dbd07" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz" integrity sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA== dependencies: "@algolia/cache-common" "4.13.0" "@algolia/logger-common" "4.13.0" "@algolia/requester-common" "4.13.0" +"@algolia/transporter@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz" + integrity sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg== + dependencies: + "@algolia/cache-common" "4.17.1" + "@algolia/logger-common" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@ampproject/remapping@^2.1.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz" integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== dependencies: "@jridgewell/trace-mapping" "^0.3.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" - integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== - -"@babel/compat-data@^7.17.10": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.15.5": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" - integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.9" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.17.10": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.15.5", "@babel/core@^7.17.10", "@babel/core@^7.4.0-0": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz" integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== dependencies: "@ampproject/remapping" "^2.1.0" @@ -218,18 +211,31 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.5", "@babel/generator@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" - integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.17.10": +"@babel/generator@^7.12.5", "@babel/generator@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz" integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== dependencies: "@babel/types" "^7.17.10" @@ -238,32 +244,22 @@ "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.17.10": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz" integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== dependencies: "@babel/compat-data" "^7.17.10" @@ -273,7 +269,7 @@ "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz" integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -286,7 +282,7 @@ "@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz" integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -294,7 +290,7 @@ "@babel/helper-define-polyfill-provider@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz" integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== dependencies: "@babel/helper-compilation-targets" "^7.13.0" @@ -308,21 +304,21 @@ "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: "@babel/types" "^7.16.7" "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz" integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: "@babel/template" "^7.16.7" @@ -330,28 +326,28 @@ "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz" integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== dependencies: "@babel/types" "^7.17.0" "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz" integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" @@ -365,24 +361,24 @@ "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -391,7 +387,7 @@ "@babel/helper-replace-supers@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz" integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" @@ -402,38 +398,38 @@ "@babel/helper-simple-access@^7.17.7": version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz" integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== dependencies: "@babel/types" "^7.17.0" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== "@babel/helper-wrap-function@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: "@babel/helper-function-name" "^7.16.7" @@ -443,7 +439,7 @@ "@babel/helpers@^7.12.5", "@babel/helpers@^7.17.9": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz" integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== dependencies: "@babel/template" "^7.16.7" @@ -452,33 +448,28 @@ "@babel/highlight@^7.16.7": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz" integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" - integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== - -"@babel/parser@^7.17.10": +"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz" integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz" integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -487,7 +478,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -496,15 +487,15 @@ "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.16.7", "@babel/plugin-proposal-class-static-block@^7.17.6": +"@babel/plugin-proposal-class-static-block@^7.17.6": version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz" integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== dependencies: "@babel/helper-create-class-features-plugin" "^7.17.6" @@ -513,7 +504,7 @@ "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -521,7 +512,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz" integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -529,7 +520,7 @@ "@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz" integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -537,7 +528,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz" integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -545,7 +536,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -553,24 +544,15 @@ "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.17.3": +"@babel/plugin-proposal-object-rest-spread@^7.17.3": version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz" integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== dependencies: "@babel/compat-data" "^7.17.0" @@ -579,9 +561,18 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -589,7 +580,7 @@ "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -598,7 +589,7 @@ "@babel/plugin-proposal-private-methods@^7.16.11": version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz" integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.10" @@ -606,7 +597,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz" integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -616,7 +607,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" @@ -624,133 +615,133 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz" integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz" integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -759,21 +750,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-classes@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -787,21 +778,21 @@ "@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.17.7": +"@babel/plugin-transform-destructuring@^7.17.7": version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz" integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" @@ -809,14 +800,14 @@ "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz" integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" @@ -824,14 +815,14 @@ "@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: "@babel/helper-compilation-targets" "^7.16.7" @@ -840,30 +831,30 @@ "@babel/plugin-transform-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz" integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.17.9": +"@babel/plugin-transform-modules-commonjs@^7.17.9": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz" integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== dependencies: "@babel/helper-module-transforms" "^7.17.7" @@ -871,9 +862,9 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.17.8": +"@babel/plugin-transform-modules-systemjs@^7.17.8": version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz" integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" @@ -884,36 +875,29 @@ "@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz" integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz" integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.17.0" "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz" integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -921,42 +905,42 @@ "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz" integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-constant-elements@^7.14.5": version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz#6cc273c2f612a6a50cb657e63ee1303e5e68d10a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz" integrity sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-display-name@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" "@babel/plugin-transform-react-jsx@^7.16.7": version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz" integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -967,29 +951,29 @@ "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.17.9": +"@babel/plugin-transform-regenerator@^7.17.9": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz" integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== dependencies: regenerator-transform "^0.15.0" "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz" integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz" integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -1001,14 +985,14 @@ "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-spread@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -1016,28 +1000,28 @@ "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz" integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typescript@^7.16.7": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz" integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -1046,102 +1030,22 @@ "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.15.6": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - -"@babel/preset-env@^7.17.10": +"@babel/preset-env@^7.15.6", "@babel/preset-env@^7.17.10": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz" integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== dependencies: "@babel/compat-data" "^7.17.10" @@ -1221,7 +1125,7 @@ "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1232,7 +1136,7 @@ "@babel/preset-react@^7.14.5", "@babel/preset-react@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz" integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -1244,7 +1148,7 @@ "@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -1253,7 +1157,7 @@ "@babel/runtime-corejs3@^7.17.9": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz#3d02d0161f0fbf3ada8e88159375af97690f4055" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz" integrity sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw== dependencies: core-js-pure "^3.20.2" @@ -1261,39 +1165,23 @@ "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.8.4": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz" integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" "@babel/template@^7.12.7", "@babel/template@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: "@babel/code-frame" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" - integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.9" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.17.10": +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz" integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== dependencies: "@babel/code-frame" "^7.16.7" @@ -1307,17 +1195,9 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.17.10": +"@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.4.4": version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz" integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -1325,17 +1205,17 @@ "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@docsearch/css@3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0.tgz#fe57b474802ffd706d3246eab25d52fac8aa3698" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz" integrity sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA== "@docsearch/react@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0.tgz#d02ebdc67573412185a6a4df13bc254c7c0da491" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz" integrity sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg== dependencies: "@algolia/autocomplete-core" "1.5.2" @@ -1343,9 +1223,9 @@ "@docsearch/css" "3.0.0" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-beta.20", "@docusaurus/core@^2.0.0-beta.20": +"@docusaurus/core@^2.0.0-beta.20", "@docusaurus/core@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-beta.20.tgz#cf4aeeccecacb547a6fb42340c83bed0cccb57c0" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.20.tgz" integrity sha512-a3UgZ4lIcIOoZd4j9INqVkWSXEDxR7EicJXt8eq2whg4N5hKGqLHoDSnWfrVSPQn4NoG5T7jhPypphSoysImfQ== dependencies: "@babel/core" "^7.17.10" @@ -1422,7 +1302,7 @@ "@docusaurus/cssnano-preset@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz#c47722e347fd044f2372e924199eabf61733232f" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz" integrity sha512-7pfrYuahHl3YYS+gYhbb1YHsq5s5+hk+1KIU7QqNNn4YjrIqAHlOznCQ9XfQfspe9boZmaNFGMZQ1tawNOVLqQ== dependencies: cssnano-preset-advanced "^5.3.3" @@ -1431,7 +1311,7 @@ "@docusaurus/logger@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz#bb49e8516e48082ab96bca11569a18541476d5a6" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz" integrity sha512-7Rt7c8m3ZM81o5jsm6ENgdbjq/hUICv8Om2i7grynI4GT2aQyFoHcusaNbRji4FZt0DaKT2CQxiAWP8BbD4xzQ== dependencies: chalk "^4.1.2" @@ -1439,7 +1319,7 @@ "@docusaurus/mdx-loader@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz#7016e8ce7e4a11c9ea458e2236d3c93af71f393f" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz" integrity sha512-BBuf77sji3JxbCEW7Qsv3CXlgpm+iSLTQn6JUK7x8vJ1JYZ3KJbNgpo9TmxIIltpcvNQ/QOy6dvqrpSStaWmKQ== dependencies: "@babel/parser" "^7.17.10" @@ -1461,7 +1341,7 @@ "@docusaurus/module-type-aliases@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz#669605a64b04226c391e0284c44743e137eb2595" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz" integrity sha512-lUIXLwQEOyYwcb3iCNibPUL6O9ijvYF5xQwehGeVraTEBts/Ch8ZwELFk+XbaGHKh52PiVxuWL2CP4Gdjy5QKw== dependencies: "@docusaurus/types" "2.0.0-beta.20" @@ -1472,7 +1352,7 @@ "@docusaurus/plugin-content-blog@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz#7c0d413ac8df9a422a0b3ddd90b77ec491bbda15" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz" integrity sha512-6aby36Gmny5h2oo/eEZ2iwVsIlBWbRnNNeqT0BYnJO5aj53iCU/ctFPpJVYcw0l2l8+8ITS70FyePIWEsaZ0jA== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1494,7 +1374,7 @@ "@docusaurus/plugin-content-docs@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz#2a53b9fc355f45bf7c6917f19be7bfa0698b8b9e" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz" integrity sha512-XOgwUqXtr/DStpB3azdN6wgkKtQkOXOx1XetORzhHnjihrSMn6daxg+spmcJh1ki/mpT3n7yBbKJxVNo+VB38Q== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1514,7 +1394,7 @@ "@docusaurus/plugin-content-pages@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz#6a76c7fa049983d2d94d8c4d738802acf01611fe" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz" integrity sha512-ubY6DG4F0skFKjfNGCbfO34Qf+MZy6C05OtpIYsoA2YU8ADx0nRH7qPgdEkwR3ma860DbY612rleRT13ogSlhg== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1528,7 +1408,7 @@ "@docusaurus/plugin-debug@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz#7c026e81c45fd4f00801a785c928b9e8727a99de" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz" integrity sha512-acGZmpncPA1XDczpV1ji1ajBCRBY/H2lXN8alSjOB1vh0c/2Qz+KKD05p17lsUbhIyvsnZBa/BaOwtek91Lu7Q== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1539,7 +1419,7 @@ "@docusaurus/plugin-google-analytics@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz#c1bdbc1239f987f9716fa30c2fd86962c190a765" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz" integrity sha512-4C5nY25j0R1lntFmpSEalhL7jYA7tWvk0VZObiIxGilLagT/f9gWPQtIjNBe4yzdQvkhiaXpa8xcMcJUAKRJyw== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1548,7 +1428,7 @@ "@docusaurus/plugin-google-gtag@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz#7284bcfad9cb4e5d63605e95f6da73ca8ac8f053" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz" integrity sha512-EMZdiMTNg4NwE60xwjbetcqMDqAOazMTwQAQ4OuNAclv7oh8+VPCvqRF8s8AxCoI2Uqc7vh8yzNUuM307Ne9JA== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1557,7 +1437,7 @@ "@docusaurus/plugin-sitemap@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz#08eada1260cafb273abea33c9c890ab667c7cbd3" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz" integrity sha512-Rf5a2vOBWjbe7PJJEBDeLZzDA7lsDi+16bqzKN8OKSXlcZLhxjmIpL5NrjANNbpGpL5vbl9z+iqvjbQmZ3QSmA== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1570,7 +1450,7 @@ "@docusaurus/preset-classic@^2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz#19566be713ce0297834cd999392ea3605bc6f574" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz" integrity sha512-artUDjiYFIlGd2fxk0iqqcJ5xSCrgormOAoind1c0pn8TRXY1WSCQWYI6p4X24jjhSCzLv0s6Z9PMDyxZdivhg== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1585,9 +1465,9 @@ "@docusaurus/theme-common" "2.0.0-beta.20" "@docusaurus/theme-search-algolia" "2.0.0-beta.20" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== dependencies: "@types/react" "*" @@ -1595,7 +1475,7 @@ "@docusaurus/theme-classic@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz#c4c7712c2b35c5654433228729f92ec73e6c598e" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz" integrity sha512-rs4U68x8Xk6rPsZC/7eaPxCKqzXX1S45FICKmq/IZuaDaQyQIijCvv2ssxYnUyVZUNayZfJK7ZtNu+A0kzYgSQ== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1621,7 +1501,7 @@ "@docusaurus/theme-common@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz#4ec7d77ecd2ade9dad33b8689e3cd51b07e594b0" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz" integrity sha512-lmdGB3/GQM5z0GH0iHGRXUco4Wfqc6sR5eRKuW4j0sx3+UFVvtbVTTIGt0Cie4Dh6omnFxjPbNDlPDgWr/agVQ== dependencies: "@docusaurus/module-type-aliases" "2.0.0-beta.20" @@ -1636,7 +1516,7 @@ "@docusaurus/theme-live-codeblock@^2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-2.0.0-beta.20.tgz#e414a55d0c95045658aac84965510953969791eb" + resolved "https://registry.npmjs.org/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-2.0.0-beta.20.tgz" integrity sha512-dAo7HVveO1GTHjvmz0wL+ZmHOU4sXqzYEqfTN4wZElaDALrv7zBSsHljXxCM29gBm4WsX44hOPgPCRUa6+HVAw== dependencies: "@docusaurus/core" "2.0.0-beta.20" @@ -1651,7 +1531,7 @@ "@docusaurus/theme-search-algolia@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz#14f2ea376a87d7cfa4840d8c917d1ec62d3a07f7" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz" integrity sha512-9XAyiXXHgyhDmKXg9RUtnC4WBkYAZUqKT9Ntuk0OaOb4mBwiYUGL74tyP0LLL6T+oa9uEdXiUMlIL1onU8xhvA== dependencies: "@docsearch/react" "^3.0.0" @@ -1673,7 +1553,7 @@ "@docusaurus/theme-translations@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz#dcc7efb43ff110c19736764c287f6c5128a5dbba" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz" integrity sha512-O7J/4dHcg7Yr+r3ylgtqmtMEz6d5ScpUxBg8nsNTWOCRoGEXNZVmXSd5l6v72KCyxPZpllPrgjmqkL+I19qWiw== dependencies: fs-extra "^10.1.0" @@ -1681,7 +1561,7 @@ "@docusaurus/types@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-beta.20.tgz#069d40cc225141d5c9a85605a1c61a460814bf5d" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.20.tgz" integrity sha512-d4ZIpcrzGsUUcZJL3iz8/iSaewobPPiYfn2Lmmv7GTT5ZPtPkOAtR5mE6+LAf/KpjjgqrC7mpwDKADnOL/ic4Q== dependencies: commander "^5.1.0" @@ -1694,14 +1574,14 @@ "@docusaurus/utils-common@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz#adb914c331d711a3c0ef2ba3f64139acdf4cd781" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz" integrity sha512-HabHh23vOQn6ygs0PjuCSF/oZaNsYTFsxB2R6EwHNyw01nWgBC3QAcGVmyIWQhlb9p8V3byKgbzVS68hZX5t9A== dependencies: tslib "^2.4.0" "@docusaurus/utils-validation@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz#ebf475a4388066bd450877fe920f405c53ff5ad2" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz" integrity sha512-7MxMoaF4VNAt5vUwvITa6nbkw1tb4WE6hp1VlfIoLCY4D7Wk5cMf1ZFhppCP1UzmPwvFb9zw8fPuvDfB3Tb5nQ== dependencies: "@docusaurus/logger" "2.0.0-beta.20" @@ -1712,7 +1592,7 @@ "@docusaurus/utils@2.0.0-beta.20": version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz#d5a9816a328b2ca5e4e1a3fbf267e3674abacd48" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz" integrity sha512-eUQquakhrbnvhsmx8jRPLgoyjyzMuOhmQC99m7rotar7XOzROpgEpm7+xVaquG5Ha47WkybE3djHJhKNih7GZQ== dependencies: "@docusaurus/logger" "2.0.0-beta.20" @@ -1733,19 +1613,19 @@ "@hapi/hoek@^9.0.0": version "9.2.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz" integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== "@hapi/topo@^5.0.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -1753,22 +1633,22 @@ "@jridgewell/resolve-uri@^3.0.3": version "3.0.6" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz" integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== "@jridgewell/set-array@^1.0.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz" integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== "@jridgewell/trace-mapping@^0.3.0": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -1776,12 +1656,12 @@ "@leichtgewicht/ip-codec@^2.0.1": version "2.0.3" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz" integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== "@mdx-js/mdx@^1.6.22": version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== dependencies: "@babel/core" "7.12.9" @@ -1806,30 +1686,30 @@ "@mdx-js/react@^1.6.22": version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== "@mdx-js/util@1.6.22": version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1837,7 +1717,7 @@ "@philpl/buble@^0.19.7": version "0.19.7" - resolved "https://registry.yarnpkg.com/@philpl/buble/-/buble-0.19.7.tgz#27231e6391393793b64bc1c982fc7b593198b893" + resolved "https://registry.npmjs.org/@philpl/buble/-/buble-0.19.7.tgz" integrity sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA== dependencies: acorn "^6.1.1" @@ -1852,34 +1732,34 @@ "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== "@sideway/address@^4.1.3": version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== dependencies: "@hapi/hoek" "^9.0.0" "@sideway/formula@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sindresorhus/is@^0.14.0": version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== "@slorber/static-site-generator-webpack-plugin@^4.0.4": version "4.0.4" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz#2bf4a2545e027830d2aa5eb950437c26a289b0f1" + resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz" integrity sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g== dependencies: bluebird "^3.7.1" @@ -1889,47 +1769,47 @@ "@svgr/babel-plugin-add-jsx-attribute@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz" integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== "@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz" integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== "@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz" integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz" integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== "@svgr/babel-plugin-svg-dynamic-title@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz" integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== "@svgr/babel-plugin-svg-em-dimensions@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz" integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== "@svgr/babel-plugin-transform-react-native-svg@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz" integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== "@svgr/babel-plugin-transform-svg-component@^6.2.0": version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz" integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== "@svgr/babel-preset@^6.2.0": version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz" integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" @@ -1941,9 +1821,9 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" "@svgr/babel-plugin-transform-svg-component" "^6.2.0" -"@svgr/core@^6.2.1": +"@svgr/core@^6.0.0", "@svgr/core@^6.2.1": version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz" integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA== dependencies: "@svgr/plugin-jsx" "^6.2.1" @@ -1952,7 +1832,7 @@ "@svgr/hast-util-to-babel-ast@^6.2.1": version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz" integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ== dependencies: "@babel/types" "^7.15.6" @@ -1960,7 +1840,7 @@ "@svgr/plugin-jsx@^6.2.1": version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz" integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g== dependencies: "@babel/core" "^7.15.5" @@ -1970,7 +1850,7 @@ "@svgr/plugin-svgo@^6.2.0": version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz" integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q== dependencies: cosmiconfig "^7.0.1" @@ -1979,7 +1859,7 @@ "@svgr/webpack@^6.2.1": version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.2.1.tgz#ef5d51c1b6be4e7537fb9f76b3f2b2e22b63c58d" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz" integrity sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw== dependencies: "@babel/core" "^7.15.5" @@ -1993,19 +1873,19 @@ "@szmarczak/http-timer@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: defer-to-connect "^1.0.1" "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@types/body-parser@*": version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" @@ -2013,14 +1893,14 @@ "@types/bonjour@^3.5.9": version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== dependencies: "@types/express-serve-static-core" "*" @@ -2028,14 +1908,14 @@ "@types/connect@*": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== dependencies: "@types/eslint" "*" @@ -2043,7 +1923,7 @@ "@types/eslint@*": version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz" integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== dependencies: "@types/estree" "*" @@ -2051,12 +1931,12 @@ "@types/estree@*", "@types/estree@^0.0.51": version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz" integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: "@types/node" "*" @@ -2065,7 +1945,7 @@ "@types/express@*", "@types/express@^4.17.13": version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== dependencies: "@types/body-parser" "*" @@ -2075,78 +1955,78 @@ "@types/hast@^2.0.0": version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== dependencies: "@types/unist" "*" "@types/history@^4.7.11": version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/html-minifier-terser@^6.0.0": version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-proxy@^1.17.8": version "1.17.8" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz" integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== dependencies: "@types/node" "*" "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/mdast@^3.0.0": version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== dependencies: "@types/unist" "*" "@types/mime@^1": version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/node@*", "@types/node@^17.0.5": version "17.0.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.26.tgz#1bbff9b23ee5a64f87b4f30c0c854b112ee2e635" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.26.tgz" integrity sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/parse5@^5.0.0": version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== "@types/prop-types@*": version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/qs@*": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-router-config@*": version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz" integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== dependencies: "@types/history" "^4.7.11" @@ -2155,7 +2035,7 @@ "@types/react-router-dom@*": version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: "@types/history" "^4.7.11" @@ -2164,16 +2044,16 @@ "@types/react-router@*": version "5.1.18" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz" integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.6.tgz#30206c3830af6ce8639b91ace5868bc2d3d1d96c" - integrity sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA== +"@types/react@*", "@types/react@>= 16.8.0 < 18.0.0": + version "17.0.60" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz" + integrity sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2181,31 +2061,31 @@ "@types/retry@^0.12.0": version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== "@types/sax@^1.2.1": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== dependencies: "@types/node" "*" "@types/scheduler@*": version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/serve-index@^1.9.1": version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== dependencies: "@types/express" "*" "@types/serve-static@*": version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: "@types/mime" "^1" @@ -2213,26 +2093,26 @@ "@types/sockjs@^0.3.33": version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== dependencies: "@types/node" "*" "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/ws@^8.5.1": version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: "@types/node" "*" "@webassemblyjs/ast@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: "@webassemblyjs/helper-numbers" "1.11.1" @@ -2240,22 +2120,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.1" @@ -2264,12 +2144,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2279,26 +2159,26 @@ "@webassemblyjs/ieee754@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2312,7 +2192,7 @@ "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2323,7 +2203,7 @@ "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2333,7 +2213,7 @@ "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2345,7 +2225,7 @@ "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -2353,17 +2233,17 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -2371,52 +2251,57 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-class-fields@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz#748058bceeb0ef25164bbc671993984083f5a085" + resolved "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz" integrity sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ== acorn-dynamic-import@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + resolved "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn-jsx@^5.0.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^6.1.1: +acorn@^6.0.0, "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^6.1.1: version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.5.0: +acorn@^8, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +acorn@^8.0.4: version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== -acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== address@^1.0.1, address@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2424,26 +2309,26 @@ aggregate-error@^3.0.0: ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv-keywords@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2451,9 +2336,19 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: +ajv@^8.0.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.0, ajv@^8.8.2: version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" @@ -2463,14 +2358,14 @@ ajv@^8.0.0, ajv@^8.8.0: algoliasearch-helper@^3.8.2: version "3.8.2" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz#35726dc6d211f49dbab0bf6d37b4658165539523" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz" integrity sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.0.0, algoliasearch@^4.13.0: +algoliasearch@^4.0.0, algoliasearch@^4.13.0, algoliasearch@^4.9.1, "algoliasearch@>= 3.1 < 5": version "4.13.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.0.tgz#e36611fda82b1fc548c156ae7929a7f486e4b663" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz" integrity sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw== dependencies: "@algolia/cache-browser-local-storage" "4.13.0" @@ -2490,48 +2385,48 @@ algoliasearch@^4.0.0, algoliasearch@^4.13.0: ansi-align@^3.0.0, ansi-align@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== anymatch@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" @@ -2539,66 +2434,54 @@ anymatch@~3.1.2: arg@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - array-flatten@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-union@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== asap@~2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.3.7: - version "10.4.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.5.tgz#662193c744094b53d3637f39be477e07bd904998" - integrity sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw== - dependencies: - browserslist "^4.20.2" - caniuse-lite "^1.0.30001332" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -autoprefixer@^10.4.5: +autoprefixer@^10.3.7, autoprefixer@^10.4.5: version "10.4.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz" integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== dependencies: browserslist "^4.20.3" @@ -2610,14 +2493,14 @@ autoprefixer@^10.4.5: axios@^0.25.0: version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: follow-redirects "^1.14.7" babel-loader@^8.2.5: version "8.2.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: find-cache-dir "^3.3.1" @@ -2627,36 +2510,36 @@ babel-loader@^8.2.5: babel-plugin-apply-mdx-type-prop@1.6.22: version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== dependencies: "@babel/helper-plugin-utils" "7.10.4" "@mdx-js/util" "1.6.22" -babel-plugin-dynamic-import-node@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" +babel-plugin-dynamic-import-node@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-extract-import-names@1.6.22: version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== dependencies: "@babel/helper-plugin-utils" "7.10.4" babel-plugin-polyfill-corejs2@^0.3.0: version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz" integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== dependencies: "@babel/compat-data" "^7.13.11" @@ -2665,7 +2548,7 @@ babel-plugin-polyfill-corejs2@^0.3.0: babel-plugin-polyfill-corejs3@^0.5.0: version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz" integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" @@ -2673,49 +2556,49 @@ babel-plugin-polyfill-corejs3@^0.5.0: babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" bail@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base16@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bluebird@^3.7.1: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== body-parser@1.19.2: version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== dependencies: bytes "3.1.2" @@ -2731,7 +2614,7 @@ body-parser@1.19.2: bonjour-service@^1.0.11: version "1.0.12" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz" integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== dependencies: array-flatten "^2.1.2" @@ -2741,12 +2624,12 @@ bonjour-service@^1.0.11: boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== boxen@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" @@ -2760,7 +2643,7 @@ boxen@^5.0.0: boxen@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== dependencies: ansi-align "^3.0.1" @@ -2774,7 +2657,7 @@ boxen@^6.2.1: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2782,14 +2665,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: version "4.20.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz" integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== dependencies: caniuse-lite "^1.0.30001332" @@ -2800,7 +2683,7 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 buble@0.19.6: version "0.19.6" - resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.6.tgz#915909b6bd5b11ee03b1c885ec914a8b974d34d3" + resolved "https://registry.npmjs.org/buble/-/buble-0.19.6.tgz" integrity sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg== dependencies: chalk "^2.4.1" @@ -2812,22 +2695,22 @@ buble@0.19.6: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== dependencies: clone-response "^1.0.2" @@ -2840,7 +2723,7 @@ cacheable-request@^6.0.0: call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2848,12 +2731,12 @@ call-bind@^1.0.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -2861,17 +2744,17 @@ camel-case@^4.1.2: camelcase-css@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -2879,33 +2762,36 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332: - version "1.0.30001332" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" - integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== - -caniuse-lite@^1.0.30001335: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: version "1.0.30001341" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz#59590c8ffa8b5939cf4161f00827b8873ad72498" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz" integrity sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA== ccount@^1.0.0, ccount@^1.0.3: version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2913,22 +2799,22 @@ chalk@^4.1.0, chalk@^4.1.2: character-entities-legacy@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== character-entities@^1.0.0: version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== character-reference-invalid@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== cheerio-select@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz" integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== dependencies: css-select "^4.3.0" @@ -2939,8 +2825,8 @@ cheerio-select@^1.5.0: cheerio@^0.22.0: version "0.22.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + resolved "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA== dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" @@ -2961,7 +2847,7 @@ cheerio@^0.22.0: cheerio@^1.0.0-rc.10: version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz" integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== dependencies: cheerio-select "^1.5.0" @@ -2974,7 +2860,7 @@ cheerio@^1.0.0-rc.10: chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -2989,39 +2875,39 @@ chokidar@^3.4.2, chokidar@^3.5.3: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== clean-css@^5.2.2, clean-css@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz" integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== dependencies: source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-boxes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== cli-table3@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== dependencies: string-width "^4.2.0" @@ -3030,7 +2916,7 @@ cli-table3@^0.6.2: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -3039,110 +2925,110 @@ clone-deep@^4.0.1: clone-response@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== dependencies: mimic-response "^1.0.0" clsx@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== collapse-white-space@^1.0.2: version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colord@^2.9.1: version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz" integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== colorette@^2.0.10: version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== combine-promises@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== comma-separated-tokens@^1.0.0: version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== commander@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-props@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/component-props/-/component-props-1.1.1.tgz#f9b7df9b9927b6e6d97c9bd272aa867670f34944" - integrity sha1-+bffm5kntubZfJvScqqGdnDzSUQ= + resolved "https://registry.npmjs.org/component-props/-/component-props-1.1.1.tgz" + integrity sha1-+bffm5kntubZfJvScqqGdnDzSUQ= sha512-69pIRJs9fCCHRqCz3390YF2LV1Lu6iEMZ5zuVqqUn+G20V9BNXlMs0cWawWeW9g4Ynmg29JmkG6R7/lUJoGd1Q== component-xor@0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/component-xor/-/component-xor-0.0.4.tgz#c55d83ccc1b94cd5089a4e93fa7891c7263e59aa" - integrity sha1-xV2DzMG5TNUImk6T+niRxyY+Wao= + resolved "https://registry.npmjs.org/component-xor/-/component-xor-0.0.4.tgz" + integrity sha1-xV2DzMG5TNUImk6T+niRxyY+Wao= sha512-ZIt6sla8gfo+AFVRZoZOertcnD5LJaY2T9CKE2j13NJxQt/mUafD69Bl7/Y4AnpI2LGjiXH7cOfJDx/n2G9edA== compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -3155,12 +3041,12 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== configstore@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== dependencies: dot-prop "^5.2.0" @@ -3172,56 +3058,56 @@ configstore@^5.0.1: connect-history-api-fallback@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== consola@^2.15.3: version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.4.2: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== copy-text-to-clipboard@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz" integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== copy-webpack-plugin@^10.2.4: version "10.2.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz" integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== dependencies: fast-glob "^3.2.7" @@ -3231,17 +3117,9 @@ copy-webpack-plugin@^10.2.4: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.22.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.2.tgz#eec621eb276518efcf718d0a6d9d042c3d0cad48" - integrity sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw== - dependencies: - browserslist "^4.20.2" - semver "7.0.0" - -core-js-compat@^3.22.1: +core-js-compat@^3.21.0, core-js-compat@^3.22.1: version "3.22.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.5.tgz#7fffa1d20cb18405bd22756ca1353c6f1a0e8614" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.5.tgz" integrity sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg== dependencies: browserslist "^4.20.3" @@ -3249,27 +3127,27 @@ core-js-compat@^3.22.1: core-js-pure@^3.20.2: version "3.22.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.2.tgz#c10bffdc3028d25c2aae505819a05543db61544f" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.2.tgz" integrity sha512-Lb+/XT4WC4PaCWWtZpNPaXmjiNDUe5CJuUtbkMrIM1kb1T/jJoAIp+bkVP/r5lHzMr+ZAAF8XHp7+my6Ol0ysQ== core-js@^2.4.1: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.22.3: version "3.22.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.5.tgz#a5f5a58e663d5c0ebb4e680cd7be37536fb2a9cf" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz" integrity sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: "@types/parse-json" "^4.0.0" @@ -3280,7 +3158,7 @@ cosmiconfig@^6.0.0: cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -3291,14 +3169,14 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: cross-fetch@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -3307,17 +3185,17 @@ cross-spawn@^7.0.3: crypto-random-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== css-declaration-sorter@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz" integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== css-loader@^6.7.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== dependencies: icss-utils "^5.1.0" @@ -3331,7 +3209,7 @@ css-loader@^6.7.1: css-minimizer-webpack-plugin@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== dependencies: cssnano "^5.0.6" @@ -3343,7 +3221,7 @@ css-minimizer-webpack-plugin@^3.4.1: css-select@^4.1.3, css-select@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -3354,8 +3232,8 @@ css-select@^4.1.3, css-select@^4.3.0: css-select@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA== dependencies: boolbase "~1.0.0" css-what "2.1" @@ -3364,30 +3242,30 @@ css-select@~1.2.0: css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" source-map "^0.6.1" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - css-what@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css-what@2.1: + version "2.1.3" + resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssnano-preset-advanced@^5.3.3: version "5.3.3" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.3.tgz#848422118d7a62b5b29a53edc160f58c7f7f7539" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.3.tgz" integrity sha512-AB9SmTSC2Gd8T7PpKUsXFJ3eNsg7dc4CTZ0+XAJ29MNxyJsrCEk7N1lw31bpHrsQH2PVJr21bbWgGAfA9j0dIA== dependencies: autoprefixer "^10.3.7" @@ -3399,7 +3277,7 @@ cssnano-preset-advanced@^5.3.3: cssnano-preset-default@^5.2.7: version "5.2.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz#791e3603fb8f1b46717ac53b47e3c418e950f5f3" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz" integrity sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA== dependencies: css-declaration-sorter "^6.2.2" @@ -3434,12 +3312,12 @@ cssnano-preset-default@^5.2.7: cssnano-utils@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6, cssnano@^5.1.7: version "5.1.7" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.7.tgz#99858bef6c76c9240f0cdc9239570bc7db8368be" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz" integrity sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg== dependencies: cssnano-preset-default "^5.2.7" @@ -3448,67 +3326,74 @@ cssnano@^5.0.6, cssnano@^5.1.7: csso@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" csstype@^3.0.2: version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz" integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^4.1.0, debug@^4.1.1: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decompress-response@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== default-gateway@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: execa "^5.0.0" defer-to-connect@^1.0.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: has-property-descriptors "^1.0.0" @@ -3516,7 +3401,7 @@ define-properties@^1.1.3: del@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + resolved "https://registry.npmjs.org/del/-/del-6.0.0.tgz" integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: globby "^11.0.1" @@ -3530,29 +3415,29 @@ del@^6.0.0: depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== detab@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== dependencies: repeat-string "^1.5.4" detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" @@ -3560,7 +3445,7 @@ detect-port-alt@^1.1.6: detect-port@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz" integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== dependencies: address "^1.0.1" @@ -3568,106 +3453,90 @@ detect-port@^1.3.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dns-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: version "5.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz" integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dom-iterator/-/dom-iterator-1.0.0.tgz#9c09899846ec41c2d257adc4d6015e4759ef05ad" + resolved "https://registry.npmjs.org/dom-iterator/-/dom-iterator-1.0.0.tgz" integrity sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig== dependencies: component-props "1.1.1" component-xor "0.0.4" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1, dom-serializer@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" entities "^2.0.0" -dom-serializer@~0.1.0: +dom-serializer@~0.1.0, dom-serializer@0: version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz" integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== dependencies: domelementtype "^1.3.0" entities "^1.1.1" -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: +domelementtype@^1.3.0, domelementtype@^1.3.1, domelementtype@1: version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^2.3.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== dependencies: domelementtype "1" domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domutils@1.5.1: +domutils@^1.5.1, domutils@1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw== dependencies: dom-serializer "0" domelementtype "1" domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -3676,7 +3545,7 @@ domutils@^2.5.2, domutils@^2.8.0: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -3684,71 +3553,71 @@ dot-case@^3.0.4: dot-prop@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA== + eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.118: version "1.4.118" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz#2d917c71712dac9652cc01af46c7d0bd51552974" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz" integrity sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== emoticon@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhanced-resolve@^5.10.0: version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" @@ -3756,59 +3625,59 @@ enhanced-resolve@^5.10.0: entities@^1.1.1, entities@~1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-module-lexer@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3816,44 +3685,44 @@ eslint-scope@5.1.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eta@^1.12.3: version "1.12.3" - resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" + resolved "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz" integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eval@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: "@types/node" "*" @@ -3861,17 +3730,17 @@ eval@^0.1.8: eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -3886,7 +3755,7 @@ execa@^5.0.0: express@^4.17.3: version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + resolved "https://registry.npmjs.org/express/-/express-4.17.3.tgz" integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== dependencies: accepts "~1.3.8" @@ -3922,24 +3791,24 @@ express@^4.17.3: extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3950,45 +3819,45 @@ fast-glob@^3.2.7, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-url-parser@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== dependencies: punycode "^1.3.2" fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" faye-websocket@^0.11.3: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" fbemitter@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== dependencies: fbjs "^3.0.0" fbjs-css-vars@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== fbjs@^3.0.0, fbjs@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== dependencies: cross-fetch "^3.1.5" @@ -4001,14 +3870,14 @@ fbjs@^3.0.0, fbjs@^3.0.1: feed@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== dependencies: xml-js "^1.6.11" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" @@ -4016,19 +3885,19 @@ file-loader@^6.2.0: filesize@^8.0.6: version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -4041,7 +3910,7 @@ finalhandler@~1.1.2: find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -4050,14 +3919,14 @@ find-cache-dir@^3.3.1: find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -4065,7 +3934,7 @@ find-up@^4.0.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -4073,7 +3942,7 @@ find-up@^5.0.0: flux@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + resolved "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz" integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== dependencies: fbemitter "^3.0.0" @@ -4081,12 +3950,12 @@ flux@^4.0.1: follow-redirects@^1.0.0, follow-redirects@^1.14.7: version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz#fd689e2d9de6ac76abb620909eea56438cd0f232" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz" integrity sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g== dependencies: "@babel/code-frame" "^7.8.3" @@ -4105,22 +3974,22 @@ fork-ts-checker-webpack-plugin@^6.5.0: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -4129,7 +3998,7 @@ fs-extra@^10.1.0: fs-extra@^9.0.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -4139,32 +4008,27 @@ fs-extra@^9.0.0: fs-monkey@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -4173,55 +4037,55 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-stream@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== github-slugger@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz" integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -4233,21 +4097,21 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: global-dirs@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: ini "2.0.0" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -4256,12 +4120,12 @@ global-prefix@^3.0.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4273,7 +4137,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^12.0.2: version "12.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== dependencies: array-union "^3.0.1" @@ -4285,7 +4149,7 @@ globby@^12.0.2: got@^9.6.0: version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== dependencies: "@sindresorhus/is" "^0.14.0" @@ -4302,12 +4166,12 @@ got@^9.6.0: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== gray-matter@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: js-yaml "^3.13.1" @@ -4317,53 +4181,53 @@ gray-matter@^4.0.3: gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-symbols@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-yarn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hast-to-hyperscript@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== dependencies: "@types/unist" "^2.0.3" @@ -4376,7 +4240,7 @@ hast-to-hyperscript@^9.0.0: hast-util-from-parse5@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz" integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== dependencies: ccount "^1.0.3" @@ -4387,7 +4251,7 @@ hast-util-from-parse5@^5.0.0: hast-util-from-parse5@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== dependencies: "@types/parse5" "^5.0.0" @@ -4399,12 +4263,12 @@ hast-util-from-parse5@^6.0.0: hast-util-parse-selector@^2.0.0: version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== hast-util-raw@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== dependencies: "@types/hast" "^2.0.0" @@ -4420,7 +4284,7 @@ hast-util-raw@6.0.1: hast-util-to-parse5@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== dependencies: hast-to-hyperscript "^9.0.0" @@ -4431,7 +4295,7 @@ hast-util-to-parse5@^6.0.0: hastscript@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz" integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== dependencies: comma-separated-tokens "^1.0.0" @@ -4441,7 +4305,7 @@ hastscript@^5.0.0: hastscript@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== dependencies: "@types/hast" "^2.0.0" @@ -4452,12 +4316,12 @@ hastscript@^6.0.0: he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== history@^4.9.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -4469,15 +4333,15 @@ history@^4.9.0: hoist-non-react-statics@^3.1.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -4486,12 +4350,12 @@ hpack.js@^2.1.6: html-entities@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" @@ -4504,17 +4368,17 @@ html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: html-tags@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== html-void-elements@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== html-webpack-plugin@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== dependencies: "@types/html-minifier-terser" "^6.0.0" @@ -4525,7 +4389,7 @@ html-webpack-plugin@^5.5.0: htmlparser2@^3.9.1: version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== dependencies: domelementtype "^1.3.1" @@ -4537,7 +4401,7 @@ htmlparser2@^3.9.1: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -4547,17 +4411,27 @@ htmlparser2@^6.1.0: http-cache-semantics@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" http-errors@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" @@ -4566,24 +4440,14 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" @@ -4594,7 +4458,7 @@ http-proxy-middleware@^2.0.3: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -4603,41 +4467,41 @@ http-proxy@^1.18.1: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ignore@^5.1.9, ignore@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== image-size@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.1.tgz#86d6cfc2b1d19eab5d2b368d4b9194d9e48541c5" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz" integrity sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ== dependencies: queue "6.0.2" immer@^9.0.7: version "9.0.12" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz" integrity sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA== import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -4645,87 +4509,87 @@ import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: import-lazy@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== infima@0.2.0-alpha.39: version "0.2.0-alpha.39" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.39.tgz#054b13ac44f3e9a42bc083988f1a1586add2f59c" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz" integrity sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.5, ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^1.0.0, is-alphabetical@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== is-alphanumerical@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== dependencies: is-alphabetical "^1.0.0" @@ -4733,75 +4597,75 @@ is-alphanumerical@^1.0.0: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-core-module@^2.8.1: version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" is-decimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== is-installed-globally@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" @@ -4809,116 +4673,116 @@ is-installed-globally@^0.4.0: is-npm@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-cwd@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-inside@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-root@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-whitespace-character@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== is-word-character@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" is-yarn-global@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jest-worker@^27.0.2, jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -4927,7 +4791,7 @@ jest-worker@^27.0.2, jest-worker@^27.4.5: joi@^17.6.0: version "17.6.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + resolved "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz" integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== dependencies: "@hapi/hoek" "^9.0.0" @@ -4938,12 +4802,12 @@ joi@^17.6.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -4951,49 +4815,49 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.1: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5002,56 +4866,56 @@ jsonfile@^6.0.1: keyv@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== dependencies: json-buffer "3.0.0" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== latest-version@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== dependencies: package-json "^6.3.0" leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== lilconfig@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -5060,12 +4924,12 @@ loader-utils@^2.0.0: loader-utils@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz" integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -5073,175 +4937,175 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.assignin@^4.0.9: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + resolved "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg== lodash.bind@^4.1.4: version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + resolved "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA== lodash.curry@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.defaults@^4.0.1: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== lodash.filter@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + resolved "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ== lodash.flatten@^4.2.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== lodash.flow@^3.3.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== lodash.foreach@^4.3.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + resolved "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== lodash.map@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.4.0: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.pick@^4.2.1: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + resolved "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== lodash.reduce@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + resolved "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw== lodash.reject@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + resolved "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ== lodash.some@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + resolved "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0, lodash.uniq@4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lowercase-keys@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" magic-string@^0.25.1, magic-string@^0.25.2: version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" markdown-escapes@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== mdast-squeeze-paragraphs@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== dependencies: unist-util-remove "^2.0.0" mdast-util-definitions@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== dependencies: unist-util-visit "^2.0.0" mdast-util-to-hast@10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== dependencies: "@types/mdast" "^3.0.0" @@ -5255,101 +5119,127 @@ mdast-util-to-hast@10.0.1: mdast-util-to-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdurl@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2, memfs@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz" integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== dependencies: fs-monkey "1.0.3" merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2": version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-db@~1.33.0: version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18: +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^2.1.31: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.17, mime-types@2.1.18: version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@~2.1.24: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mini-create-react-context@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + resolved "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz" integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: "@babel/runtime" "^7.12.1" @@ -5357,86 +5247,81 @@ mini-create-react-context@^0.4.0: mini-css-extract-plugin@^2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz" integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== dependencies: schema-utils "^4.0.0" minimalistic-assert@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - minimatch@^3.0.4: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.5: version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mrmime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz" integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns@^7.2.4: version "7.2.4" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz" integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - nanoid@^3.3.3: version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -5444,87 +5329,87 @@ no-case@^3.0.4: node-emoji@^1.10.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-forge@^1: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-releases@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz" integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^4.1.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== normalize-url@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== nth-check@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: boolbase "^1.0.0" nth-check@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" @@ -5534,38 +5419,38 @@ object.assign@^4.1.0: obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^8.0.9, open@^8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: define-lazy-prop "^2.0.0" @@ -5574,64 +5459,64 @@ open@^8.0.9, open@^8.4.0: opener@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== os-homedir@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== p-cancelable@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-retry@^4.5.0: version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz" integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== dependencies: "@types/retry" "^0.12.0" @@ -5639,12 +5524,12 @@ p-retry@^4.5.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json@^6.3.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== dependencies: got "^9.6.0" @@ -5654,7 +5539,7 @@ package-json@^6.3.0: param-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -5662,14 +5547,14 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== dependencies: character-entities "^1.0.0" @@ -5681,7 +5566,7 @@ parse-entities@^2.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5691,34 +5576,34 @@ parse-json@^5.0.0: parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" parse5@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -5726,83 +5611,83 @@ pascal-case@^3.1.2: path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pkg-dir@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-up@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" postcss-calc@^8.2.3: version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: postcss-selector-parser "^6.0.9" @@ -5810,7 +5695,7 @@ postcss-calc@^8.2.3: postcss-colormin@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz" integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== dependencies: browserslist "^4.16.6" @@ -5820,41 +5705,41 @@ postcss-colormin@^5.3.0: postcss-convert-values@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz#f8d3abe40b4ce4b1470702a0706343eac17e7c10" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz" integrity sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g== dependencies: postcss-value-parser "^4.2.0" postcss-discard-comments@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz#e90019e1a0e5b99de05f63516ce640bd0df3d369" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz" integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== postcss-discard-duplicates@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== postcss-discard-empty@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== postcss-discard-overridden@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== postcss-discard-unused@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== dependencies: postcss-selector-parser "^6.0.5" postcss-loader@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== dependencies: cosmiconfig "^7.0.0" @@ -5863,7 +5748,7 @@ postcss-loader@^6.2.1: postcss-merge-idents@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== dependencies: cssnano-utils "^3.1.0" @@ -5871,7 +5756,7 @@ postcss-merge-idents@^5.1.1: postcss-merge-longhand@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz#0f46f8753989a33260efc47de9a0cdc571f2ec5c" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz" integrity sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA== dependencies: postcss-value-parser "^4.2.0" @@ -5879,7 +5764,7 @@ postcss-merge-longhand@^5.1.4: postcss-merge-rules@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz#d327b221cd07540bcc8d9ff84446d8b404d00162" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz" integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== dependencies: browserslist "^4.16.6" @@ -5889,14 +5774,14 @@ postcss-merge-rules@^5.1.1: postcss-minify-font-values@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: postcss-value-parser "^4.2.0" postcss-minify-gradients@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: colord "^2.9.1" @@ -5905,7 +5790,7 @@ postcss-minify-gradients@^5.1.1: postcss-minify-params@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz#77e250780c64198289c954884ebe3ee4481c3b1c" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz" integrity sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g== dependencies: browserslist "^4.16.6" @@ -5914,19 +5799,19 @@ postcss-minify-params@^5.1.2: postcss-minify-selectors@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz" integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== dependencies: postcss-selector-parser "^6.0.5" postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== postcss-modules-local-by-default@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: icss-utils "^5.0.0" @@ -5935,61 +5820,61 @@ postcss-modules-local-by-default@^4.0.0: postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-normalize-charset@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== postcss-normalize-display-values@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-positions@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz" integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-repeat-style@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz" integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-string@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-timing-functions@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-unicode@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz" integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== dependencies: browserslist "^4.16.6" @@ -5997,7 +5882,7 @@ postcss-normalize-unicode@^5.1.0: postcss-normalize-url@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: normalize-url "^6.0.1" @@ -6005,14 +5890,14 @@ postcss-normalize-url@^5.1.0: postcss-normalize-whitespace@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: postcss-value-parser "^4.2.0" postcss-ordered-values@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz" integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== dependencies: cssnano-utils "^3.1.0" @@ -6020,14 +5905,14 @@ postcss-ordered-values@^5.1.1: postcss-reduce-idents@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== dependencies: postcss-value-parser "^4.2.0" postcss-reduce-initial@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz" integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== dependencies: browserslist "^4.16.6" @@ -6035,14 +5920,14 @@ postcss-reduce-initial@^5.1.0: postcss-reduce-transforms@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: postcss-value-parser "^4.2.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" @@ -6050,14 +5935,14 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector postcss-sort-media-queries@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz#a99bae69ef1098ee3b64a5fa94d258ec240d0355" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz" integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== dependencies: sort-css-media-queries "2.0.4" postcss-svgo@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: postcss-value-parser "^4.2.0" @@ -6065,33 +5950,24 @@ postcss-svgo@^5.1.0: postcss-unique-selectors@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: postcss-selector-parser "^6.0.5" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss-zindex@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.7: - version "8.4.12" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" - integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== - dependencies: - nanoid "^3.3.1" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.13: +"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.4, postcss@^8.4.7: version "8.4.13" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz" integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== dependencies: nanoid "^3.3.3" @@ -6100,12 +5976,12 @@ postcss@^8.4.13: prepend-http@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== pretty-error@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" @@ -6113,42 +5989,42 @@ pretty-error@^4.0.0: pretty-time@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prism-react-renderer@^1.0.1, prism-react-renderer@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz#88fc9d0df6bed06ca2b9097421349f8c2f24e30d" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz" integrity sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ== prismjs@^1.28.0: version "1.28.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz" integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== promise@^7.1.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" prompts@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -6157,14 +6033,14 @@ prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: property-information@^5.0.0, property-information@^5.3.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== dependencies: xtend "^4.0.0" proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -6172,7 +6048,7 @@ proxy-addr@~2.0.7: pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -6180,63 +6056,68 @@ pump@^3.0.0: punycode@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== pupa@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" pure-color@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== qs@6.9.7: version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue@6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== dependencies: inherits "~2.0.3" randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + raw-body@2.4.3: version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz" integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== dependencies: bytes "3.1.2" @@ -6246,7 +6127,7 @@ raw-body@2.4.3: rc@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -6256,8 +6137,8 @@ rc@^1.2.8: react-base16-styling@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== dependencies: base16 "^1.0.0" lodash.curry "^4.0.1" @@ -6266,7 +6147,7 @@ react-base16-styling@^0.6.0: react-dev-utils@^12.0.1: version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== dependencies: "@babel/code-frame" "^7.16.0" @@ -6294,28 +6175,38 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 18.0.0": version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" scheduler "^0.20.2" +react-dom@^16.0.0: + version "16.14.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + react-error-overlay@^6.0.11: version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-fast-compare@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== react-helmet-async@*, react-helmet-async@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: "@babel/runtime" "^7.12.5" @@ -6326,12 +6217,12 @@ react-helmet-async@*, react-helmet-async@^1.3.0: react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-json-view@^1.21.3: version "1.21.3" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== dependencies: flux "^4.0.1" @@ -6341,12 +6232,12 @@ react-json-view@^1.21.3: react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-live@2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/react-live/-/react-live-2.2.3.tgz#260f99194213799f0005e473e7a4154c699d6a7c" + resolved "https://registry.npmjs.org/react-live/-/react-live-2.2.3.tgz" integrity sha512-tpKruvfytNETuzO3o1mrQUj180GVrq35IE8F5gH1NJVPt4szYCx83/dOSCOyjgRhhc3gQvl0pQ3k/CjOjwJkKQ== dependencies: buble "0.19.6" @@ -6359,21 +6250,29 @@ react-live@2.2.3: react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== dependencies: "@babel/runtime" "^7.10.3" +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-router-config@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== dependencies: "@babel/runtime" "^7.1.2" react-router-dom@^5.2.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.1.tgz#0151baf2365c5fcd8493f6ec9b9b31f34d0f8ae1" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.1.tgz" integrity sha512-f0pj/gMAbv9e8gahTmCEY20oFhxhrmHwYeIwH5EO5xu0qme+wXtsdB8YfUOAZzUz4VaXmb58m3ceiLtjMhqYmQ== dependencies: "@babel/runtime" "^7.12.13" @@ -6384,9 +6283,9 @@ react-router-dom@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.1, react-router@^5.2.0: +react-router@^5.2.0, react-router@>=5, react-router@5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.1.tgz#b13e84a016c79b9e80dde123ca4112c4f117e3cf" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.1.tgz" integrity sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ== dependencies: "@babel/runtime" "^7.12.13" @@ -6402,29 +6301,38 @@ react-router@5.3.1, react-router@^5.2.0: react-simple-code-editor@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.10.0.tgz#73e7ac550a928069715482aeb33ccba36efe2373" + resolved "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.10.0.tgz" integrity sha512-bL5W5mAxSW6+cLwqqVWY47Silqgy2DKDTR4hDBrLrUqC5BXc29YVx17l2IZk5v36VcDEq1Bszu2oHm1qBwKqBA== react-textarea-autosize@^8.3.2: version "8.3.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz" integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== dependencies: "@babel/runtime" "^7.10.2" use-composed-ref "^1.0.0" use-latest "^1.0.0" -react@^17.0.2: +react@*, "react@^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 18.0.0", react@>=0.14.9, react@>=15, react@17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" +react@^16.0.0, react@^16.14.0: + version "16.14.0" + resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + readable-stream@^2.0.1: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -6437,7 +6345,7 @@ readable-stream@^2.0.1: readable-stream@^3.0.6, readable-stream@^3.1.1: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -6446,64 +6354,76 @@ readable-stream@^3.0.6, readable-stream@^3.1.1: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reading-time@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" regenerate-unicode-properties@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== dependencies: regenerate "^1.4.2" regenerate-unicode-properties@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.15.0: version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== dependencies: "@babel/runtime" "^7.8.4" -regexpu-core@^4.2.0, regexpu-core@^4.5.4: +regexpu-core@^4.2.0: + version "4.8.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regexpu-core@^4.5.4: version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: regenerate "^1.4.2" @@ -6515,7 +6435,7 @@ regexpu-core@^4.2.0, regexpu-core@^4.5.4: regexpu-core@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== dependencies: regenerate "^1.4.2" @@ -6527,45 +6447,45 @@ regexpu-core@^5.0.1: registry-auth-token@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz" integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" registry-url@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== dependencies: rc "^1.2.8" regjsgen@^0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsgen@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== regjsparser@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" regjsparser@^0.8.2: version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== dependencies: jsesc "~0.5.0" rehype-parse@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz" integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== dependencies: hast-util-from-parse5 "^5.0.0" @@ -6574,12 +6494,12 @@ rehype-parse@^6.0.2: relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-admonitions@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" + resolved "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz" integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== dependencies: rehype-parse "^6.0.2" @@ -6588,7 +6508,7 @@ remark-admonitions@^1.2.1: remark-emoji@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== dependencies: emoticon "^3.2.0" @@ -6597,12 +6517,12 @@ remark-emoji@^2.2.0: remark-footnotes@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== remark-mdx@1.6.22: version "1.6.22" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== dependencies: "@babel/core" "7.12.9" @@ -6616,7 +6536,7 @@ remark-mdx@1.6.22: remark-parse@8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== dependencies: ccount "^1.0.0" @@ -6638,14 +6558,14 @@ remark-parse@8.0.3: remark-squeeze-paragraphs@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== dependencies: mdast-squeeze-paragraphs "^4.0.0" renderkid@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" @@ -6656,37 +6576,37 @@ renderkid@^3.0.0: repeat-string@^1.5.4: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== "require-like@>= 0.1.1": version "0.1.2" - resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" - integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: is-core-module "^2.8.1" @@ -6695,36 +6615,36 @@ resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: responselike@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rtl-detect@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== rtlcss@^3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== dependencies: find-up "^5.0.0" @@ -6734,67 +6654,89 @@ rtlcss@^3.5.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rxjs@^7.5.4: version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz" integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - schema-utils@^2.6.5: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" @@ -6803,7 +6745,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: schema-utils@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== dependencies: "@types/json-schema" "^7.0.9" @@ -6811,9 +6753,18 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.0.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + section-matter@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== dependencies: extend-shallow "^2.0.1" @@ -6821,48 +6772,68 @@ section-matter@^1.0.0: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz" integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== dependencies: node-forge "^1" semver-diff@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== dependencies: semver "^6.3.0" -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - semver@^5.4.1: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.1: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + send@0.17.2: version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" @@ -6881,14 +6852,14 @@ send@0.17.2: serialize-javascript@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" serve-handler@^6.1.3: version "6.1.3" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz" integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== dependencies: bytes "3.0.0" @@ -6902,8 +6873,8 @@ serve-handler@^6.1.3: serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6915,7 +6886,7 @@ serve-index@^1.9.1: serve-static@1.14.2: version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" @@ -6925,51 +6896,51 @@ serve-static@1.14.2: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -6978,12 +6949,12 @@ shelljs@^0.8.5: signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sirv@^1.0.7: version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== dependencies: "@polka/url" "^1.0.0-next.20" @@ -6992,12 +6963,12 @@ sirv@^1.0.7: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sitemap@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== dependencies: "@types/node" "^17.0.5" @@ -7007,17 +6978,17 @@ sitemap@^7.1.1: slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== sockjs@^0.3.21: version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" @@ -7026,22 +6997,22 @@ sockjs@^0.3.21: sort-css-media-queries@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz" integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -7049,32 +7020,32 @@ source-map-support@~0.5.20: source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.7.2: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== space-separated-tokens@^1.0.0: version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -7086,7 +7057,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -7097,32 +7068,55 @@ spdy@^4.0.2: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stable@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== state-toggle@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== std-env@^3.0.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.1.1.tgz#1f19c4d3f6278c52efd08a94574a2a8d32b7d092" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz" integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -7131,30 +7125,16 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 string-width@^5.0.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -7163,48 +7143,48 @@ stringify-object@^3.3.0: strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: +style-to-object@^0.3.0, style-to-object@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: inline-style-parser "0.1.1" stylehacks@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz" integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== dependencies: browserslist "^4.16.6" @@ -7212,38 +7192,38 @@ stylehacks@^5.1.0: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.2: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^2.5.0, svgo@^2.7.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: "@trysound/sax" "0.2.0" @@ -7256,17 +7236,17 @@ svgo@^2.5.0, svgo@^2.7.0: tapable@^1.0.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz" integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== dependencies: jest-worker "^27.4.5" @@ -7277,7 +7257,7 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: terser@^5.10.0, terser@^5.7.2: version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" + resolved "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz" integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== dependencies: acorn "^8.5.0" @@ -7287,89 +7267,89 @@ terser@^5.10.0, terser@^5.7.2: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tiny-invariant@^1.0.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-readable-stream@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-trailing-lines@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== trim@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== trough@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^2.5.0: version "2.12.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.12.2.tgz#80a53614e6b9b475eb9077472fb7498dc7aa51d0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz" integrity sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -7377,26 +7357,31 @@ type-is@~1.6.18: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" +"typescript@>= 2.7": + version "5.0.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + ua-parser-js@^0.7.30: version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz" integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== unescape@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96" + resolved "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz" integrity sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ== dependencies: extend-shallow "^2.0.1" unherit@^1.0.4: version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== dependencies: inherits "^2.0.0" @@ -7404,12 +7389,12 @@ unherit@^1.0.4: unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -7417,96 +7402,96 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== unicode-property-aliases-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^8.4.2: + version "8.4.2" + resolved "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== dependencies: bail "^1.0.0" extend "^3.0.0" - is-buffer "^2.0.0" is-plain-obj "^2.0.0" trough "^1.0.0" vfile "^4.0.0" -unified@^8.4.2: - version "8.4.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" - integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" + is-buffer "^2.0.0" is-plain-obj "^2.0.0" trough "^1.0.0" vfile "^4.0.0" unique-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: crypto-random-string "^2.0.0" -unist-builder@2.0.3, unist-builder@^2.0.0: +unist-builder@^2.0.0, unist-builder@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== unist-util-generated@^1.0.0: version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== unist-util-is@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-position@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== unist-util-remove-position@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== dependencies: unist-util-visit "^2.0.0" unist-util-remove@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== dependencies: unist-util-is "^4.0.0" unist-util-stringify-position@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== dependencies: "@types/unist" "^2.0.2" unist-util-visit-parents@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: +unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: "@types/unist" "^2.0.0" @@ -7515,17 +7500,17 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist- universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-notifier@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== dependencies: boxen "^5.0.0" @@ -7545,14 +7530,14 @@ update-notifier@^5.1.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-loader@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" @@ -7561,71 +7546,71 @@ url-loader@^4.1.1: url-parse-lax@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" use-composed-ref@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== use-isomorphic-layout-effect@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-latest@^1.0.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: use-isomorphic-layout-effect "^1.1.1" util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utila@~0.4: version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utility-types@^3.10.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== vfile-message@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" @@ -7633,7 +7618,7 @@ vfile-message@^2.0.0: vfile@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" @@ -7643,12 +7628,12 @@ vfile@^4.0.0: vlq@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + resolved "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== wait-on@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== dependencies: axios "^0.25.0" @@ -7659,7 +7644,7 @@ wait-on@^6.0.1: watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -7667,24 +7652,24 @@ watchpack@^2.4.0: wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" web-namespaces@^1.0.0, web-namespaces@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webpack-bundle-analyzer@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz" integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: acorn "^8.0.4" @@ -7699,7 +7684,7 @@ webpack-bundle-analyzer@^4.5.0: webpack-dev-middleware@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz" integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== dependencies: colorette "^2.0.10" @@ -7710,7 +7695,7 @@ webpack-dev-middleware@^5.3.1: webpack-dev-server@^4.8.1: version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz#737dbf44335bb8bde68f8f39127fc401c97a1557" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz" integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== dependencies: "@types/bonjour" "^3.5.9" @@ -7744,7 +7729,7 @@ webpack-dev-server@^4.8.1: webpack-merge@^5.8.0: version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" @@ -7752,7 +7737,7 @@ webpack-merge@^5.8.0: webpack-sources@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -7760,12 +7745,12 @@ webpack-sources@^1.4.3: webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.72.0: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.72.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": version "5.76.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz" integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== dependencies: "@types/eslint-scope" "^3.7.3" @@ -7795,7 +7780,7 @@ webpack@^5.72.0: webpackbar@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== dependencies: chalk "^4.1.0" @@ -7803,9 +7788,9 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -7814,53 +7799,53 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" widest-line@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" widest-line@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: string-width "^5.0.1" wildcard@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -7869,7 +7854,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz" integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== dependencies: ansi-styles "^6.1.0" @@ -7878,12 +7863,12 @@ wrap-ansi@^8.0.1: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -7893,47 +7878,47 @@ write-file-atomic@^3.0.0: ws@^7.3.1: version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== ws@^8.4.2: version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== xdg-basedir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== xml-js@^1.6.11: version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" xtend@^4.0.0, xtend@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zwitch@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==